BASE DE DATOS

1) Preparación de los datos (I)

a) Lectura del dataset y su estructura

#Exportamos la base
base <- read_excel("base_corregida_final.xlsx")

#creamos una variable con todos los nombres para futuras referencias:
nombres <- c("Pac_Sex", "Pac_Edad", "Pac_Cobertura", "Pac_HTA", "Pac_DBT", "Pac_TBQ", "Pac_DLP", "Pac_ICC", "Pac_FA", "Pac_ETVpre", "Pac_TEPpre", "Pac_TEP_previo_menor_3_meses", "Pac_Deamb", "Pac_Reposo", "Pac_EPOC", "Pac_ACVglobal", "Pac_Hemorragia_Previa_Mayor_Todas", "Pac_Hemorragia_Previa_Mayor_Reciente", "Pac_EnfAuto", "Pac_IRCglobal", "Pac_SmeProcoag", "PESI_Cancer", "Pac_ACO_Previa", "IMC", "MotInt", "PESI_Det_Sens", "CC_Horas_Sx_Admision", "CC_FC_Ingreso", "PESI_Taquicardia", "CC_TAS_Ingreso", "PESI_Hipotension", "CC_FR_Ingreso", "PESI_Taquipnea", "PESI_Hipotermia", "CC_SaO_Ingreso", "CC_SaO90", "Wells", "PESIcalc", "PESI_clasif", "PESIsCalc", "PESIs_Clasif", "Pac_Cx_Total", "Lab_Hto", "Lab_Hb", "Lab_GB", "Lab_Cr", "Lab_Plaq", "Biomarc_pos", "ECOTT_FSVI", "ECOTT_TAPSE", "ECOTT_PSAP", "ECOTT_DisfVD", "Alta_Carga_Trombo_TAC", "Int_O_Alto_Riesgo_Calc", "EstRiesgo", "ServicioCargo", "RIETE_Calc", "RIETE_Grupo", "HASBLED", "ACOint", "FVCI", "Tto_Reperf", "TL_cual", "Compl_Sang_Todos", "Compl_SoporteHD_NO", "Alta_Tto_TiposACO", "DOAC_si_vs_no")

#ordenamos su estructura
base[sapply(base, is.character)] <- lapply(base[sapply(base, is.character)], as.factor)
  • De una muestra original de 684 pacientes internados por tener complicaciones tromboembólicas, se registraron, en primera instancia, 322 variables.
    Esas variables referían a: características sociales y demográficas; aspectos de sus historias clínicas; características clínicas registradas en el momento de ingreso nosocomial; resultados de estudios complementarios realizados durante el período de internación –que incluyen imágenes y bioindicadores de laboratorio-; indicadores de estado en el momento del alta; prescripciones para tratamiento preventivo; indicadores de seguimiento a los 30 días (¿pautas de alarma?). Otras variables incluidas consisten en un conjunto de índices compuestos relacionados con la estimación de riesgos diversos: Registro Informatizado de Pacientes con Enfermedad Trombo Embólica (RIETE); Índice de Wells para Trombosis Venosa Profunda (TVP - Wells); Índice de Severidad para el Embolismo Pulmonar (Pulmonary Embolism Severity Index, PESI); y una escala de Estratificación pronóstica y tratamiento de la tromboembolia pulmonar en fase aguda (EstRiesgo). Se conservan estos índices para compararlos con las estimaciones multivariadas que puedan obtenerse con los datos fundamentales.
    De ellas se seleccionaron 69 variables que presentan el contenido conceptual fundamental para el ajuste de un modelo explicativo centrado en el análisis multivariante de las probabilidades de sufrir episodios de sangrado. Las 253 variables excluídas presentaban articulaciones lógicas o aritméticas de algunas de las 69 variables conservadas, de modo que se optó por concentrar el análisis en las dimensiones empíricas fundamentales.
    Por último, se incluye la variable Compl_Sang_Todos última como variable que expresa el desenlace fundamental, y que se adopta como variable respuesta para los modelos de regresión: si el paciente sufrió algún tipo de sangrado como complicación del tratamiento anti coagulante y/o de reperfusión realizado. Incluye todos los sangrados de la clasificación BARC mayor o igual a II: sangrados que requieren atención médica o más

2) Análisis de datos faltantes (I)

a) Valores únicos y faltantes

prop_miss(base)*100
[1] 3.02
prop_miss(base$Compl_Sang_Todos)
[1] 0
vis_dat(base) + ggtitle("Gráfico 1 - Valores perdidos según tipos de variables (n = 684)")

# vis_miss(base) + ggtitle("Gráfico 2 - Porcentaje de valores perdidos o no registrados por variables (n = 684)") ### ¡ATENCIÓN! ### Saco este gráfico porque está más abajo como Gráfico 5.
# Revisar si estoy nombrando bien las variables de agrupamiento.
# Los gráficos 4, 5 y 6 permiten ver la distribución de valores perdidos en porcentajes de cada una de las variables. Estos gráficos son más ordenadores y hasta permitirían apreciar cuáles son las variables con más valores perdidos. Los gg_miss_var no permiten comparar las distribuciones porque las cantidades de UA con sangrados son siempre mucho menores.
# gg_miss_var_cumsum(x = base) + ggtitle("Gráfico 3 - Valores perdidos acumulados por variables (n = 684)")
gg_miss_fct(x = base, fct = Compl_Sang_Todos) + ggtitle("Gráfico 2 - Porcentajes de valores perdidos según desenlace de todos los tipos de sangrado (n = 684)")


# ¡ATENCIÓN! # No se incluyen los gráficos que siguen porque como las UA con sangrado son siempre muchas menos, la comparación visual en términos absolutos pierde sentido.
# gg_miss_var(x = base, fct = Compl_Sang_Todos)
# gg_miss_var(base, facet = Compl_Sang_Interm)
# gg_miss_var(base, facet = Compl_Sang_Mayor)

# Relación con otras variables.
aggr_plot <- aggr(base, col=c('cyan','red'), numbers=TRUE, sortVars=TRUE, labels=names(base), cex.axis=.7, gap=3, ylab=c("Gráfico 5 - Proporción de valores perdidos por variable (n = 684)","Gráfico 6 - Patrón de valores perdidos en la matriz de datos (n = 684)")) # Están muy buenos estos gráficos. Cambié el azul obscuro por cyan, que permite apreciar mejor la distribución por dato. Y le cambié el título porque, en verdad, el primero no sería un histograma: muestra la proporción de valores perdidos por variable, una junto a la otra. El segundo, en cambio, muestra cómo se distribuyen los valores perdidos por UA y por Variables. Quizá podamos dejar estos dos gráficos junto y sacar el que yo titulé 3.
Warning: not enough vertical space to display frequencies (too many combinations)

 Variables sorted by number of missings: 

# Saco a los casos con faltantes
bd_prueba <- na.omit(base)
n_inicial <- nrow(base)
n_final <- nrow(bd_prueba)
(n_inicial- n_final)/n_inicial
[1] 0.765
#Descriptiva segun si tiene o no faltantes
base$miss.univ<-ifelse(!is.na(base$Compl_Sang_Todos), 0, 1)
tab1_miss <- tableby(miss.univ ~ ., data = base)
Warning: The by-variable has fewer than two levels; statistical tests are ignored
tab1_miss
tableby Object

Function Call:
tableby(formula = miss.univ ~ ., data = base)

Variable(s):
miss.univ ~ Pac_Sex, Pac_Edad, Pac_Cobertura, Pac_HTA, Pac_DBT, Pac_TBQ, Pac_DLP, Pac_ICC, Pac_FA, Pac_ETVpre, Pac_TEP_previo_menor_3_meses, Pac_Deamb, Pac_Reposo, Pac_EPOC, Pac_ACVglobal, Pac_Hemorragia_Previa_Mayor_Todas, Pac_Hemorragia_Previa_Mayor_Reciente, Pac_EnfAuto, Pac_IRCglobal, Pac_SmeProcoag, PESI_Cancer, Pac_ACO_Previa, Peso, IMC, MotInt, PESI_Det_Sens, CC_Horas_Sx_Admision, CC_FC_Ingreso, PESI_Taquicardia, CC_TAS_Ingreso, PESI_Hipotension, CC_FR_Ingreso, PESI_Taquipnea, PESI_Hipotermia, CC_SaO_Ingreso, CC_SaO90, Wells, PESIcalc, PESI_clasif, PESIsCalc, PESIs_Clasif, Pac_Cx_Total, Lab_Hto, Lab_Hb, Lab_GB, Lab_Cr, Lab_Plaq, Biomarc_pos, ECOTT_FSVI, ECOTT_TAPSE, ECOTT_PSAP, ECOTT_DisfVD, Alta_Carga_Trombo_TAC, Int_O_Alto_Riesgo_Calc, EstRiesgo, ServicioCargo, RIETE_Calc, RIETE_Grupo, HASBLED, ACOint, FVCI, Tto_Reperf, TL_cual, Compl_Sang_Todos, Compl_SoporteHD_NO, TiempoInt, Alta_Tto_TiposACO, DOAC_si_vs_no
summary(tab1_miss)
0 (N=684) Total (N=684)
Pac_Sex
   Femenino 388 (56.7%) 388 (56.7%)
   Masculino 296 (43.3%) 296 (43.3%)
Pac_Edad
   Mean (SD) 63.801 (16.777) 63.801 (16.777)
   Range 16.000 - 97.000 16.000 - 97.000
Pac_Cobertura
   Estatal 99 (14.5%) 99 (14.5%)
   Obra Social 307 (44.9%) 307 (44.9%)
   PAMI 82 (12.0%) 82 (12.0%)
   Prepaga / Privada 196 (28.7%) 196 (28.7%)
Pac_HTA
   No 301 (44.0%) 301 (44.0%)
   Si 383 (56.0%) 383 (56.0%)
Pac_DBT
   No 586 (85.7%) 586 (85.7%)
   Si 98 (14.3%) 98 (14.3%)
Pac_TBQ
   Ex-tabaquista 76 (11.1%) 76 (11.1%)
   No 420 (61.4%) 420 (61.4%)
   Tabaquista 188 (27.5%) 188 (27.5%)
Pac_DLP
   No 481 (70.3%) 481 (70.3%)
   Si 203 (29.7%) 203 (29.7%)
Pac_ICC
   No 606 (88.6%) 606 (88.6%)
   Si 78 (11.4%) 78 (11.4%)
Pac_FA
   No 636 (93.0%) 636 (93.0%)
   Si 48 (7.0%) 48 (7.0%)
Pac_ETVpre
   No 564 (82.5%) 564 (82.5%)
   Si 120 (17.5%) 120 (17.5%)
Pac_TEP_previo_menor_3_meses
   No 678 (99.1%) 678 (99.1%)
   Si 6 (0.9%) 6 (0.9%)
Pac_Deamb
   Ninguna 517 (75.6%) 517 (75.6%)
   Si 167 (24.4%) 167 (24.4%)
Pac_Reposo
   No 498 (72.8%) 498 (72.8%)
   Si 186 (27.2%) 186 (27.2%)
Pac_EPOC
   No 623 (91.1%) 623 (91.1%)
   Si 61 (8.9%) 61 (8.9%)
Pac_ACVglobal
   No 643 (94.0%) 643 (94.0%)
   Si 41 (6.0%) 41 (6.0%)
Pac_Hemorragia_Previa_Mayor_Todas
   No 655 (95.8%) 655 (95.8%)
   Si 29 (4.2%) 29 (4.2%)
Pac_Hemorragia_Previa_Mayor_Reciente
   No 665 (97.2%) 665 (97.2%)
   Si 19 (2.8%) 19 (2.8%)
Pac_EnfAuto
   No 649 (94.9%) 649 (94.9%)
   Si 35 (5.1%) 35 (5.1%)
Pac_IRCglobal
   No 630 (92.1%) 630 (92.1%)
   Si 54 (7.9%) 54 (7.9%)
Pac_SmeProcoag
   No 657 (96.1%) 657 (96.1%)
   Si 27 (3.9%) 27 (3.9%)
PESI_Cancer
   No 494 (72.2%) 494 (72.2%)
   Si 190 (27.8%) 190 (27.8%)
Pac_ACO_Previa
   No 620 (90.6%) 620 (90.6%)
   Si 64 (9.4%) 64 (9.4%)
Peso
   N-Miss 9 9
   Mean (SD) 82.482 (19.614) 82.482 (19.614)
   Range 40.000 - 158.000 40.000 - 158.000
IMC
   N-Miss 56 56
   Mean (SD) 29.629 (6.482) 29.629 (6.482)
   Range 15.418 - 57.333 15.418 - 57.333
MotInt
   Otros 25 (3.7%) 25 (3.7%)
   Patología clínica 69 (10.1%) 69 (10.1%)
   Patología quirúrgica 63 (9.2%) 63 (9.2%)
   TEP 484 (70.8%) 484 (70.8%)
   Trauma 19 (2.8%) 19 (2.8%)
   TVP 24 (3.5%) 24 (3.5%)
PESI_Det_Sens
   No 650 (95.0%) 650 (95.0%)
   Si 34 (5.0%) 34 (5.0%)
CC_Horas_Sx_Admision
   N-Miss 70 70
   Mean (SD) 119.046 (217.283) 119.046 (217.283)
   Range 0.000 - 2160.000 0.000 - 2160.000
CC_FC_Ingreso
   N-Miss 5 5
   Mean (SD) 96.053 (22.093) 96.053 (22.093)
   Range 30.000 - 180.000 30.000 - 180.000
PESI_Taquicardia
   N-Miss 2 2
   No 426 (62.5%) 426 (62.5%)
   Si 256 (37.5%) 256 (37.5%)
CC_TAS_Ingreso
   N-Miss 5 5
   Mean (SD) 122.404 (22.920) 122.404 (22.920)
   Range 50.000 - 220.000 50.000 - 220.000
PESI_Hipotension
   No 605 (88.5%) 605 (88.5%)
   Si 79 (11.5%) 79 (11.5%)
CC_FR_Ingreso
   N-Miss 26 26
   Mean (SD) 21.798 (5.383) 21.798 (5.383)
   Range 0.000 - 43.000 0.000 - 43.000
PESI_Taquipnea
   N-Miss 26 26
   No 349 (53.0%) 349 (53.0%)
   Si 309 (47.0%) 309 (47.0%)
PESI_Hipotermia
   N-Miss 15 15
   No 624 (93.3%) 624 (93.3%)
   Si 45 (6.7%) 45 (6.7%)
CC_SaO_Ingreso
   N-Miss 18 18
   Mean (SD) 92.331 (6.001) 92.331 (6.001)
   Range 50.000 - 100.000 50.000 - 100.000
CC_SaO90
   N-Miss 17 17
   No 500 (75.0%) 500 (75.0%)
   Si 167 (25.0%) 167 (25.0%)
Wells
   N-Miss 5 5
   Mean (SD) 4.108 (2.315) 4.108 (2.315)
   Range 0.000 - 10.500 0.000 - 10.500
PESIcalc
   Mean (SD) 96.915 (34.881) 96.915 (34.881)
   Range 16.000 - 239.000 16.000 - 239.000
PESI_clasif
   Mean (SD) 2.940 (1.317) 2.940 (1.317)
   Range 1.000 - 5.000 1.000 - 5.000
PESIsCalc
   Mean (SD) 1.380 (1.147) 1.380 (1.147)
   Range 0.000 - 5.000 0.000 - 5.000
PESIs_Clasif
   Mean (SD) 0.738 (0.440) 0.738 (0.440)
   Range 0.000 - 1.000 0.000 - 1.000
Pac_Cx_Total
   No 520 (76.0%) 520 (76.0%)
   Si 164 (24.0%) 164 (24.0%)
Lab_Hto
   N-Miss 5 5
   Mean (SD) 37.380 (6.611) 37.380 (6.611)
   Range 13.000 - 59.000 13.000 - 59.000
Lab_Hb
   N-Miss 23 23
   Mean (SD) 12.191 (2.178) 12.191 (2.178)
   Range 6.000 - 18.000 6.000 - 18.000
Lab_GB
   N-Miss 7 7
   Mean (SD) 11171.840 (7303.752) 11171.840 (7303.752)
   Range 1130.000 - 108000.000 1130.000 - 108000.000
Lab_Cr
   N-Miss 11 11
   Mean (SD) 1.061 (0.594) 1.061 (0.594)
   Range 0.200 - 6.800 0.200 - 6.800
Lab_Plaq
   N-Miss 40 40
   Mean (SD) 221986.491 (94408.669) 221986.491 (94408.669)
   Range 17700.000 - 731000.000 17700.000 - 731000.000
Biomarc_pos
   N-Miss 200 200
   No 153 (31.6%) 153 (31.6%)
   Si 331 (68.4%) 331 (68.4%)
ECOTT_FSVI
   N-Miss 64 64
   Deprimida 16 (2.6%) 16 (2.6%)
   Leve 36 (5.8%) 36 (5.8%)
   Moderada 14 (2.3%) 14 (2.3%)
   Normal 532 (85.8%) 532 (85.8%)
   Severa 22 (3.5%) 22 (3.5%)
ECOTT_TAPSE
   N-Miss 239 239
   Mean (SD) 18.214 (5.526) 18.214 (5.526)
   Range 3.000 - 35.000 3.000 - 35.000
ECOTT_PSAP
   N-Miss 240 240
   Mean (SD) 46.341 (17.966) 46.341 (17.966)
   Range 10.000 - 120.000 10.000 - 120.000
ECOTT_DisfVD
   N-Miss 86 86
   No 379 (63.4%) 379 (63.4%)
   Si 219 (36.6%) 219 (36.6%)
Alta_Carga_Trombo_TAC
   N-Miss 94 94
   No 69 (11.7%) 69 (11.7%)
   Si 521 (88.3%) 521 (88.3%)
Int_O_Alto_Riesgo_Calc
   No 256 (37.4%) 256 (37.4%)
   Si 428 (62.6%) 428 (62.6%)
EstRiesgo
   N-Miss 8 8
   Alto riesgo 102 (15.1%) 102 (15.1%)
   Bajo riesgo 164 (24.3%) 164 (24.3%)
   Intermedio-alto riesgo 178 (26.3%) 178 (26.3%)
   Intermedio-bajo riesgo 232 (34.3%) 232 (34.3%)
ServicioCargo
   N-Miss 4 4
   Cardiología 513 (75.4%) 513 (75.4%)
   Otro 167 (24.6%) 167 (24.6%)
RIETE_Calc
   N-Miss 11 11
   Mean (SD) 2.513 (1.325) 2.513 (1.325)
   Range 1.000 - 6.000 1.000 - 6.000
RIETE_Grupo
   N-Miss 11 11
   Mean (SD) 1.117 (0.322) 1.117 (0.322)
   Range 1.000 - 2.000 1.000 - 2.000
HASBLED
   Mean (SD) 1.175 (1.016) 1.175 (1.016)
   Range 0.000 - 6.000 0.000 - 6.000
ACOint
   No 23 (3.4%) 23 (3.4%)
   Si 661 (96.6%) 661 (96.6%)
FVCI
   N-Miss 15 15
   No 626 (93.6%) 626 (93.6%)
   Si 43 (6.4%) 43 (6.4%)
Tto_Reperf
   No 593 (86.7%) 593 (86.7%)
   Si 91 (13.3%) 91 (13.3%)
TL_cual
   Alteplase 30 (4.4%) 30 (4.4%)
   Estreptokinasa 48 (7.0%) 48 (7.0%)
   Ninguno 567 (82.9%) 567 (82.9%)
   No 39 (5.7%) 39 (5.7%)
Compl_Sang_Todos
   No 627 (91.7%) 627 (91.7%)
   Si 57 (8.3%) 57 (8.3%)
Compl_SoporteHD_NO
   No 572 (83.6%) 572 (83.6%)
   Si 112 (16.4%) 112 (16.4%)
TiempoInt
   N-Miss 94 94
   Mean (SD) 14.414 (22.235) 14.414 (22.235)
   Range 0.000 - 256.000 0.000 - 256.000
Alta_Tto_TiposACO
   AVK 348 (50.9%) 348 (50.9%)
   DOACs 108 (15.8%) 108 (15.8%)
   HBPM 123 (18.0%) 123 (18.0%)
   Obito 83 (12.1%) 83 (12.1%)
   Sin ACO 22 (3.2%) 22 (3.2%)
DOAC_si_vs_no
   No 576 (84.2%) 576 (84.2%)
   Si 108 (15.8%) 108 (15.8%)
NA
  • La base contiene un 2.979 % de valores perdidos y/o no registrados. El Gráfico 1 muestra los valores perdidos por variable y según el tipo de variable: cualitativa o cuantitativa. Los Gráficos 2, 3 y 4 muestran los porcentajes de valores no registrados agrupados según desenlace de sangrado total, intermedio y mayor. En el Gráfico 5 se pueden apreciar las proporciones de valores perdidos por variables, y en el 6 el patrón general de distribución de los valores faltantes en la matriz de datos.
    Sólo …. registros de la base estaban completos, de manera que al 76.462 % de los registros les faltaba al menos un valor.
    Tres variables concentran la mayor cantidad de valores faltantes: ECOTT_PSAP, con 240 valores perdidos, y ECOTT_TAPSE, con 239 valores perdidos. Se trata de medidas de la función cardíaca por ecografía transtorácica. La variable Biomarc_pos, que registra marcadores positivos de enzimas cardíacas, muestra 200 valores faltantes. En menor medida, el tiempo de internación, variable TiempoInt, presenta 94 valores perdidos, y la medición de disfunción ventricular derecha por ecografía transtorácica, variable ECOTT_DisfVD, 86 valores perdidos.
    Esta magnitud de valores perdidos o faltantes justifica implementar mecanismos de imputación que impidan perder el 23.538 % de los datos construidos en el trabajo de campo, que es el porcentaje de unidades de análisis con al menos un valor perdido.

b) Matrix y gráficos de correlación

  • Se realiza el análisis de correlación entre las variables cuantitativas:
# Chequeo cuales son las variables numéricas para poder calcular la matriz de correlación

head(base)

# Calculo matriz de correlación para los registros completos (omitiendo faltantes) con ambos métodos 
# Pearson
matriz.correl.pe <- base %>%  dplyr::select_if(is.numeric) %>%
 correlate(use = "complete.obs", method = "pearson")
Warning: the standard deviation is zero
Correlation method: 'pearson'
Missing treated using: 'complete.obs'
#Armo tabla de correlación con método de Pearson 
matriz.correl.pe%>%
  shave() %>%
  fashion() 

# Spearman
matriz.correl.sp <- base %>%  dplyr::select_if(is.numeric) %>%
 correlate(use = "complete.obs", method = "spearman")
Warning: the standard deviation is zero
Correlation method: 'spearman'
Missing treated using: 'complete.obs'
#Armo tabla de correlación con método de Spearman
matriz.correl.sp %>% 
  shave() %>%   
  fashion()

#Grafico solo spearman ya que es el más robusto ante presencia de outliers
matriz.correl.sp %>% rplot(colors = c("red", "blue"))

c) Interpretación correlación

  • Se observa solamente una gran asocicación positiva fuerte entre las variables hematorcrito, Hto, y hemoglobina, Hb con una correlación de 87%, lo cual tiene sentido ya que de la hemoglobina resulta el hemtocrito. En los modelos a estudiar tomaremos la decisión de utilizar Hb como variable, ya que es la variable utilizada en todos los scores.
  • También se ve gran asociación positiva fuerte entre las variables PESIcalc y PESI_Clasif, ya que la clasificación se realiza desde el cálculo numérico de PESI. Se toma la decisión de dejar no la clasificación sino el cálculo de PESI (PESIcalc).

3) Preparación de los datos (I)

a) Elimninación de la variables Hto, PESI_clasif, PESIsCalc y PESIs_Clasif

  • Se elimina la variable Hto por registrar correlación positiva fuerte con la variable Hb (0.87). Las otras variables se eliminan y se dejan solo los scores originales.
#Armo nuevo dataset excluyendo la variable Hto
base_3 <- base %>%
    dplyr::select(., -c(Lab_Hto, PESI_clasif, PESIsCalc, PESIs_Clasif, RIETE_Grupo))

b) Imputación de los datos faltantes

  • Se decide imputar los datos datos faltantes, obteniendo 684 datos de las 66 variables elegidas.
base_3[sapply(base_3, is.character)] <- lapply(base_3[sapply(base_3, is.character)], as.factor)

base_imputada <- mice(base_3, m = 1,  defaultMethod = c("pmm", "logreg", "polyreg", "polr"), maxit = 5, printFlag = F)
Warning: Number of logged events: 136
summary(base_imputada)
Class: mids
Number of multiple imputations:  1 
Imputation methods:
                             Pac_Sex                             Pac_Edad                        Pac_Cobertura 
                                  ""                                   ""                                   "" 
                             Pac_HTA                              Pac_DBT                              Pac_TBQ 
                                  ""                                   ""                                   "" 
                             Pac_DLP                              Pac_ICC                               Pac_FA 
                                  ""                                   ""                                   "" 
                          Pac_ETVpre         Pac_TEP_previo_menor_3_meses                            Pac_Deamb 
                                  ""                                   ""                                   "" 
                          Pac_Reposo                             Pac_EPOC                        Pac_ACVglobal 
                                  ""                                   ""                                   "" 
   Pac_Hemorragia_Previa_Mayor_Todas Pac_Hemorragia_Previa_Mayor_Reciente                          Pac_EnfAuto 
                                  ""                                   ""                                   "" 
                       Pac_IRCglobal                       Pac_SmeProcoag                          PESI_Cancer 
                                  ""                                   ""                                   "" 
                      Pac_ACO_Previa                                 Peso                                  IMC 
                                  ""                                "pmm"                                "pmm" 
                              MotInt                        PESI_Det_Sens                 CC_Horas_Sx_Admision 
                                  ""                                   ""                                "pmm" 
                       CC_FC_Ingreso                     PESI_Taquicardia                       CC_TAS_Ingreso 
                               "pmm"                             "logreg"                                "pmm" 
                    PESI_Hipotension                        CC_FR_Ingreso                       PESI_Taquipnea 
                                  ""                                "pmm"                             "logreg" 
                     PESI_Hipotermia                       CC_SaO_Ingreso                             CC_SaO90 
                            "logreg"                                "pmm"                             "logreg" 
                               Wells                             PESIcalc                         Pac_Cx_Total 
                               "pmm"                                   ""                                   "" 
                              Lab_Hb                               Lab_GB                               Lab_Cr 
                               "pmm"                                "pmm"                                "pmm" 
                            Lab_Plaq                          Biomarc_pos                           ECOTT_FSVI 
                               "pmm"                             "logreg"                            "polyreg" 
                         ECOTT_TAPSE                           ECOTT_PSAP                         ECOTT_DisfVD 
                               "pmm"                                "pmm"                             "logreg" 
               Alta_Carga_Trombo_TAC               Int_O_Alto_Riesgo_Calc                            EstRiesgo 
                            "logreg"                                   ""                            "polyreg" 
                       ServicioCargo                           RIETE_Calc                              HASBLED 
                            "logreg"                                "pmm"                                   "" 
                              ACOint                                 FVCI                           Tto_Reperf 
                                  ""                             "logreg"                                   "" 
                             TL_cual                     Compl_Sang_Todos                   Compl_SoporteHD_NO 
                                  ""                                   ""                                   "" 
                           TiempoInt                    Alta_Tto_TiposACO                        DOAC_si_vs_no 
                               "pmm"                                   ""                                   "" 
                           miss.univ 
                                  "" 
PredictorMatrix:
              Pac_Sex Pac_Edad Pac_Cobertura Pac_HTA Pac_DBT Pac_TBQ Pac_DLP Pac_ICC Pac_FA Pac_ETVpre Pac_TEP_previo_menor_3_meses Pac_Deamb
Pac_Sex             0        1             1       1       1       1       1       1      1          1                            1         1
Pac_Edad            1        0             1       1       1       1       1       1      1          1                            1         1
Pac_Cobertura       1        1             0       1       1       1       1       1      1          1                            1         1
Pac_HTA             1        1             1       0       1       1       1       1      1          1                            1         1
Pac_DBT             1        1             1       1       0       1       1       1      1          1                            1         1
Pac_TBQ             1        1             1       1       1       0       1       1      1          1                            1         1
              Pac_Reposo Pac_EPOC Pac_ACVglobal Pac_Hemorragia_Previa_Mayor_Todas Pac_Hemorragia_Previa_Mayor_Reciente Pac_EnfAuto
Pac_Sex                1        1             1                                 1                                    1           1
Pac_Edad               1        1             1                                 1                                    1           1
Pac_Cobertura          1        1             1                                 1                                    1           1
Pac_HTA                1        1             1                                 1                                    1           1
Pac_DBT                1        1             1                                 1                                    1           1
Pac_TBQ                1        1             1                                 1                                    1           1
              Pac_IRCglobal Pac_SmeProcoag PESI_Cancer Pac_ACO_Previa Peso IMC MotInt PESI_Det_Sens CC_Horas_Sx_Admision CC_FC_Ingreso
Pac_Sex                   1              1           1              1    1   1      1             1                    1             1
Pac_Edad                  1              1           1              1    1   1      1             1                    1             1
Pac_Cobertura             1              1           1              1    1   1      1             1                    1             1
Pac_HTA                   1              1           1              1    1   1      1             1                    1             1
Pac_DBT                   1              1           1              1    1   1      1             1                    1             1
Pac_TBQ                   1              1           1              1    1   1      1             1                    1             1
              PESI_Taquicardia CC_TAS_Ingreso PESI_Hipotension CC_FR_Ingreso PESI_Taquipnea PESI_Hipotermia CC_SaO_Ingreso CC_SaO90 Wells
Pac_Sex                      1              1                1             1              1               1              1        1     1
Pac_Edad                     1              1                1             1              1               1              1        1     1
Pac_Cobertura                1              1                1             1              1               1              1        1     1
Pac_HTA                      1              1                1             1              1               1              1        1     1
Pac_DBT                      1              1                1             1              1               1              1        1     1
Pac_TBQ                      1              1                1             1              1               1              1        1     1
              PESIcalc Pac_Cx_Total Lab_Hb Lab_GB Lab_Cr Lab_Plaq Biomarc_pos ECOTT_FSVI ECOTT_TAPSE ECOTT_PSAP ECOTT_DisfVD
Pac_Sex              1            1      1      1      1        1           1          1           1          1            1
Pac_Edad             1            1      1      1      1        1           1          1           1          1            1
Pac_Cobertura        1            1      1      1      1        1           1          1           1          1            1
Pac_HTA              1            1      1      1      1        1           1          1           1          1            1
Pac_DBT              1            1      1      1      1        1           1          1           1          1            1
Pac_TBQ              1            1      1      1      1        1           1          1           1          1            1
              Alta_Carga_Trombo_TAC Int_O_Alto_Riesgo_Calc EstRiesgo ServicioCargo RIETE_Calc HASBLED ACOint FVCI Tto_Reperf TL_cual
Pac_Sex                           1                      1         1             1          1       1      1    1          1       1
Pac_Edad                          1                      1         1             1          1       1      1    1          1       1
Pac_Cobertura                     1                      1         1             1          1       1      1    1          1       1
Pac_HTA                           1                      1         1             1          1       1      1    1          1       1
Pac_DBT                           1                      1         1             1          1       1      1    1          1       1
Pac_TBQ                           1                      1         1             1          1       1      1    1          1       1
              Compl_Sang_Todos Compl_SoporteHD_NO TiempoInt Alta_Tto_TiposACO DOAC_si_vs_no miss.univ
Pac_Sex                      1                  1         1                 1             1         0
Pac_Edad                     1                  1         1                 1             1         0
Pac_Cobertura                1                  1         1                 1             1         0
Pac_HTA                      1                  1         1                 1             1         0
Pac_DBT                      1                  1         1                 1             1         0
Pac_TBQ                      1                  1         1                 1             1         0
Number of logged events:  136 
densityplot(base_imputada)


base_imp <- complete(base_imputada)

n_miss(base_imp)
[1] 0

c) Creación de nuevas variables de interés

  • Se crea la variable de clearence de creatinina con formula de Cockcroft Gault. Creamos la variable edad >75 años para explorar si es predictor de sangrado. Es una variable que se incluye en el score de RIETE y plaquetas <100.000 a modo exploratorio.
base_imp$ClCr <- ((140 - base_imp$Pac_Edad) * base_imp$Peso) / (72 * base_imp$Lab_Cr)
base_imp$ClCr <- ifelse (base_imp$Pac_Sex == "Femenino", base_imp$ClCr*0.85, base_imp$ClCr)
summary(base_imp$ClCr)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
     10      57      78      91     118     336 
base_imp$Pac_Edad_Corte <- ifelse (base_imp$Pac_Edad >= 75, "Si", "No")
base_imp$Lab_Plaq_Corte <- ifelse (base_imp$Lab_Plaq >= 100000, "Si", "No")

base_imp$TEP_motivo_int <- ifelse (base_imp$MotInt == "TEP", "Si", "No")

base_backup <- base_imp

ANALISIS EXPLORATORIO

4) Analisis exploratorios (II)

a) Tablas descriptivas de las variables cuantitativas:


#TABLA 1
#Tabla resumen cuantitativas con media/SD, mediana/IQ
resumen_cuant <- round(basicStats(base_imp[,c("Pac_Edad","CC_TAS_Ingreso", "CC_FC_Ingreso", "Wells", "PESIcalc", "RIETE_Calc", "Lab_Hb", "Lab_Cr", "Lab_Plaq", "ECOTT_TAPSE", "ECOTT_PSAP", "TiempoInt")]), digits = 2)
kbl(resumen_cuant, digits = 1,caption= "Tabla resumen - Variables cuantitativas" )%>%
  kable_paper("hover", full_width = T)
Tabla resumen - Variables cuantitativas
Pac_Edad CC_TAS_Ingreso CC_FC_Ingreso Wells PESIcalc RIETE_Calc Lab_Hb Lab_Cr Lab_Plaq ECOTT_TAPSE ECOTT_PSAP TiempoInt
nobs 684.0 684.0 684.0 684.0 684.0 684.0 684.0 684.0 684.0 684.0 684.0 684.0
NAs 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Minimum 16.0 50.0 30.0 0.0 16.0 1.0 6.0 0.2 17700.0 3.0 10.0 0.0
Maximum 97.0 220.0 180.0 10.5 239.0 6.0 18.0 6.8 731000.0 35.0 120.0 256.0
1. Quartile 53.0 110.0 80.0 2.5 75.0 1.0 10.9 0.7 159000.0 15.0 33.0 5.0
3. Quartile 76.0 138.2 110.0 6.0 115.0 3.5 13.7 1.2 272000.0 22.0 55.0 13.2
Mean 63.8 122.3 96.1 4.1 96.9 2.5 12.2 1.1 223059.1 18.7 45.5 14.2
Median 67.0 120.0 98.0 4.0 93.0 2.5 12.3 0.9 205000.0 19.0 42.0 8.0
Sum 43640.0 83655.0 65728.0 2811.6 66290.0 1725.0 8330.7 723.6 152572400.0 12792.1 31106.5 9708.0
SE Mean 0.6 0.9 0.8 0.1 1.3 0.0 0.1 0.0 3591.8 0.2 0.7 0.8
LCL Mean 62.5 120.6 94.4 3.9 94.3 2.4 12.0 1.0 216006.7 18.3 44.1 12.6
UCL Mean 65.1 124.0 97.8 4.3 99.5 2.6 12.3 1.1 230111.4 19.1 46.9 15.8
Variance 281.5 525.3 486.4 5.4 1216.7 1.8 4.8 0.3 8824376769.8 29.3 341.1 460.1
Stdev 16.8 22.9 22.0 2.3 34.9 1.3 2.2 0.6 93938.1 5.4 18.5 21.4
Skewness -0.6 0.1 0.4 0.3 0.9 0.5 -0.2 3.9 1.0 -0.1 1.2 5.2
Kurtosis -0.2 0.8 0.5 -0.5 1.4 -0.7 -0.2 24.4 2.2 0.2 1.8 38.0
NA

b) Tabla 1 - Tabla resumen global


#Tabla 1 - Resumen global
myvars_tab1 <- names(base_imp)
mycat_tab1 <- c("Pac_Sex", "Pac_Cobertura", "Pac_HTA", "Pac_DBT", "Pac_TBQ", "Pac_DLP", "Pac_ICC", "Pac_FA", "Pac_ETVpre", "Pac_TEPpre", "Pac_TEP_previo_menor_3_meses", "Pac_Deamb", "Pac_Reposo", "Pac_EPOC", "Pac_ACVglobal", "Pac_Hemorragia_Previa_Mayor_Todas", "Pac_Hemorragia_Previa_Mayor_Reciente", "Pac_EnfAuto", "Pac_IRCglobal", "Pac_SmeProcoag", "PESI_Cancer", "Pac_ACO_Previa", "MotInt", "PESI_Det_Sens", "PESI_Taquicardia","PESI_Hipotension", "PESI_Taquipnea", "PESI_Hipotermia", "CC_SaO90", "Pac_Cx_Total", "Biomarc_pos", "ECOTT_FSVI","ECOTT_DisfVD", "Alta_Carga_Trombo_TAC", "Int_O_Alto_Riesgo_Calc", "EstRiesgo", "ServicioCargo", "RIETE_Grupo", "ACOint", "FVCI", "Tto_Reperf", "TL_cual", "Compl_Sang_Todos", "Compl_Sang_Mayor", "Compl_Sang_Interm", "Compl_SoporteHD_NO", "Alta_Tto_TiposACO", "DOAC_si_vs_no")

no_normal <- c("Pac_Edad","CC_TAS_Ingreso", "CC_FC_Ingreso", "Wells", "PESIcalc", "RIETE_Calc", "Lab_Hb", "Lab_Cr", "Lab_Plaq", "ECOTT_TAPSE", "ECOTT_PSAP", "TiempoInt", "ClCr", "Peso", "CC_Horas_Sx_Admision",  "Lab_GB", "CC_SaO_Ingreso", "CC_FR_Ingreso")
variable_rta <- "Compl_Sang_Todos"

tab1 <- CreateTableOne(vars=myvars_tab1, data = base_imp, factorVars = mycat_tab1, includeNA = F, test = T)
Warning: The data frame does not have: Pac_TEPpre RIETE_Grupo Compl_Sang_Mayor Compl_Sang_Interm  Dropped
a_tab1 <- print(tab1,  quote = FALSE, noSpaces = TRUE, nonnormal = no_normal,
                printToggle = FALSE, formatOptions = list(big.mark = ","))


kbl(a_tab1, digits = 1, caption = " TABLA 1: Población general")%>%
  kable_classic(full_width = F, html_font = "Cambria") #CAMBIA DISEÑO DE TABLA
TABLA 1: Población general
Overall
n 684
Pac_Sex = Masculino (%) 296 (43.3)
Pac_Edad (median [IQR]) 67.00 [53.00, 76.00]
Pac_Cobertura (%)
Estatal 99 (14.5)
Obra Social 307 (44.9)
PAMI 82 (12.0)
Prepaga / Privada 196 (28.7)
Pac_HTA = Si (%) 383 (56.0)
Pac_DBT = Si (%) 98 (14.3)
Pac_TBQ (%)
Ex-tabaquista 76 (11.1)
No 420 (61.4)
Tabaquista 188 (27.5)
Pac_DLP = Si (%) 203 (29.7)
Pac_ICC = Si (%) 78 (11.4)
Pac_FA = Si (%) 48 (7.0)
Pac_ETVpre = Si (%) 120 (17.5)
Pac_TEP_previo_menor_3_meses = Si (%) 6 (0.9)
Pac_Deamb = Si (%) 167 (24.4)
Pac_Reposo = Si (%) 186 (27.2)
Pac_EPOC = Si (%) 61 (8.9)
Pac_ACVglobal = Si (%) 41 (6.0)
Pac_Hemorragia_Previa_Mayor_Todas = Si (%) 29 (4.2)
Pac_Hemorragia_Previa_Mayor_Reciente = Si (%) 19 (2.8)
Pac_EnfAuto = Si (%) 35 (5.1)
Pac_IRCglobal = Si (%) 54 (7.9)
Pac_SmeProcoag = Si (%) 27 (3.9)
PESI_Cancer = Si (%) 190 (27.8)
Pac_ACO_Previa = Si (%) 64 (9.4)
Peso (median [IQR]) 80.00 [70.00, 92.00]
IMC (mean (SD)) 29.61 (6.47)
MotInt (%)
Otros 25 (3.7)
Patología clínica 69 (10.1)
Patología quirúrgica 63 (9.2)
TEP 484 (70.8)
Trauma 19 (2.8)
TVP 24 (3.5)
PESI_Det_Sens = Si (%) 34 (5.0)
CC_Horas_Sx_Admision (median [IQR]) 48.00 [7.00, 120.00]
CC_FC_Ingreso (median [IQR]) 98.00 [80.00, 110.00]
PESI_Taquicardia = Si (%) 258 (37.7)
CC_TAS_Ingreso (median [IQR]) 120.00 [110.00, 138.25]
PESI_Hipotension = Si (%) 79 (11.5)
CC_FR_Ingreso (median [IQR]) 20.00 [18.00, 25.00]
PESI_Taquipnea = Si (%) 317 (46.3)
PESI_Hipotermia = Si (%) 47 (6.9)
CC_SaO_Ingreso (median [IQR]) 94.00 [89.75, 97.00]
CC_SaO90 = Si (%) 174 (25.4)
Wells (median [IQR]) 4.00 [2.50, 6.00]
PESIcalc (median [IQR]) 93.00 [75.00, 115.00]
Pac_Cx_Total = Si (%) 164 (24.0)
Lab_Hb (median [IQR]) 12.30 [10.90, 13.70]
Lab_GB (median [IQR]) 10,120.00 [7,600.00, 13,000.00]
Lab_Cr (median [IQR]) 0.90 [0.72, 1.19]
Lab_Plaq (median [IQR]) 205,000.00 [159,000.00, 272,000.00]
Biomarc_pos = Si (%) 372 (54.4)
ECOTT_FSVI (%)
Deprimida 22 (3.2)
Leve 42 (6.1)
Moderada 17 (2.5)
Normal 573 (83.8)
Severa 30 (4.4)
ECOTT_TAPSE (median [IQR]) 19.00 [15.00, 22.00]
ECOTT_PSAP (median [IQR]) 42.00 [33.00, 55.00]
ECOTT_DisfVD = Si (%) 243 (35.5)
Alta_Carga_Trombo_TAC = Si (%) 595 (87.0)
Int_O_Alto_Riesgo_Calc = Si (%) 428 (62.6)
EstRiesgo (%)
Alto riesgo 104 (15.2)
Bajo riesgo 165 (24.1)
Intermedio-alto riesgo 180 (26.3)
Intermedio-bajo riesgo 235 (34.4)
ServicioCargo = Otro (%) 168 (24.6)
RIETE_Calc (median [IQR]) 2.50 [1.00, 3.50]
HASBLED (mean (SD)) 1.17 (1.02)
ACOint = Si (%) 661 (96.6)
FVCI = Si (%) 46 (6.7)
Tto_Reperf = Si (%) 91 (13.3)
TL_cual (%)
Alteplase 30 (4.4)
Estreptokinasa 48 (7.0)
Ninguno 567 (82.9)
No 39 (5.7)
Compl_Sang_Todos = Si (%) 57 (8.3)
Compl_SoporteHD_NO = Si (%) 112 (16.4)
TiempoInt (median [IQR]) 8.00 [5.00, 13.25]
Alta_Tto_TiposACO (%)
AVK 348 (50.9)
DOACs 108 (15.8)
HBPM 123 (18.0)
Obito 83 (12.1)
Sin ACO 22 (3.2)
DOAC_si_vs_no = Si (%) 108 (15.8)
miss.univ (mean (SD)) 0.00 (0.00)
ClCr (median [IQR]) 78.33 [56.85, 118.06]
Pac_Edad_Corte = Si (%) 199 (29.1)
Lab_Plaq_Corte = Si (%) 656 (95.9)
TEP_motivo_int = Si (%) 484 (70.8)
NA

c) Tabla 2 - Según Complicación Sangrado - TODOS LOS SANGRADOS

#TABLA 2 - SUBPOBLACIONES CON Y SIN COMPLICACION_SANGRADO
myvars_tab2 <- names(base_imp)
mycat_tab2 <- c("Pac_Sex", "Pac_Cobertura", "Pac_HTA", "Pac_DBT", "Pac_TBQ", "Pac_DLP", "Pac_ICC", "Pac_FA", "Pac_ETVpre", "Pac_TEPpre", "Pac_TEP_previo_menor_3_meses", "Pac_Deamb", "Pac_Reposo", "Pac_EPOC", "Pac_ACVglobal", "Pac_Hemorragia_Previa_Mayor_Todas", "Pac_Hemorragia_Previa_Mayor_Reciente", "Pac_EnfAuto", "Pac_IRCglobal", "Pac_SmeProcoag", "PESI_Cancer", "Pac_ACO_Previa", "MotInt", "PESI_Det_Sens", "PESI_Taquicardia","PESI_Hipotension", "PESI_Taquipnea", "PESI_Hipotermia", "CC_SaO90", "Pac_Cx_Total", "Biomarc_pos", "ECOTT_FSVI","ECOTT_DisfVD", "Alta_Carga_Trombo_TAC", "Int_O_Alto_Riesgo_Calc", "EstRiesgo", "ServicioCargo", "RIETE_Grupo", "ACOint", "FVCI", "Tto_Reperf", "TL_cual", "Compl_Sang_Todos", "Compl_Sang_Mayor", "Compl_Sang_Interm", "Compl_SoporteHD_NO", "Alta_Tto_TiposACO", "DOAC_si_vs_no")

norm_test<-apply(base_imp[, c("Pac_Edad","CC_TAS_Ingreso", "CC_FC_Ingreso", "Wells", "PESIcalc", "RIETE_Calc", "Lab_Hb", "Lab_Cr", "Lab_Plaq", "ECOTT_TAPSE", "ECOTT_PSAP", "TiempoInt")], 2, function(x) shapiro.test(x)$p.value)
norm_test
                                    Pac_Edad                               CC_TAS_Ingreso                                CC_FC_Ingreso 
0.000000000005850301615147456521378761550535 0.000000322218898606360984895831183968950562 0.000000432274838466870868266948325919774021 
                                       Wells                                     PESIcalc                                   RIETE_Calc 
0.000000000083762032246184240439996491433248 0.000000000000572559265207126687417167879622 0.000000000000000000003651089523917186140279 
                                      Lab_Hb                                       Lab_Cr                                     Lab_Plaq 
0.000216455453001795038430604689594360934279 0.000000000000000000000000000000001779773096 0.000000000000015157675650288842018655160994 
                                 ECOTT_TAPSE                                   ECOTT_PSAP                                    TiempoInt 
0.000000883728701761579749478507823934325671 0.000000000000000001395563299981117564562582 0.000000000000000000000000000000000000000601 
options(digits=3, scipen = 999)

no_normal <- c("Pac_Edad","CC_TAS_Ingreso", "CC_FC_Ingreso", "Wells", "PESIcalc", "RIETE_Calc", "Lab_Hb", "Lab_Cr", "Lab_Plaq", "ECOTT_TAPSE", "ECOTT_PSAP", "TiempoInt")
variable_rta <- "Compl_Sang_Todos"

tab2 <- CreateTableOne(vars = myvars_tab2, data = base_imp, factorVars = mycat_tab2, strata = variable_rta, includeNA = F, test = T)
Warning: The data frame does not have: Pac_TEPpre RIETE_Grupo Compl_Sang_Mayor Compl_Sang_Interm  Dropped
a_tab2 <- print(tab2,  quote = FALSE, noSpaces = TRUE,nonnormal = no_normal,
                printToggle = FALSE, formatOptions = list(big.mark = ","))

kbl(a_tab2, digits = 1, col.names = c( "Complicación Sangrado = No", "Complicación Sangrado = Si", "p-value", "test"), caption = " TABLA 2")%>%
  kable_classic(full_width = F, html_font = "Cambria")
TABLA 2
Complicación Sangrado = No Complicación Sangrado = Si p-value test
n 627 57
Pac_Sex = Masculino (%) 268 (42.7) 28 (49.1) 0.429
Pac_Edad (median [IQR]) 67.00 [53.50, 76.00] 64.00 [52.00, 73.00] 0.195 nonnorm
Pac_Cobertura (%) 0.260
Estatal 90 (14.4) 9 (15.8)
Obra Social 276 (44.0) 31 (54.4)
PAMI 75 (12.0) 7 (12.3)
Prepaga / Privada 186 (29.7) 10 (17.5)
Pac_HTA = Si (%) 354 (56.5) 29 (50.9) 0.501
Pac_DBT = Si (%) 88 (14.0) 10 (17.5) 0.599
Pac_TBQ (%) 0.770
Ex-tabaquista 70 (11.2) 6 (10.5)
No 387 (61.7) 33 (57.9)
Tabaquista 170 (27.1) 18 (31.6)
Pac_DLP = Si (%) 189 (30.1) 14 (24.6) 0.464
Pac_ICC = Si (%) 70 (11.2) 8 (14.0) 0.663
Pac_FA = Si (%) 44 (7.0) 4 (7.0) 1.000
Pac_ETVpre = Si (%) 115 (18.3) 5 (8.8) 0.102
Pac_TEP_previo_menor_3_meses = Si (%) 6 (1.0) 0 (0.0) 1.000
Pac_Deamb = Si (%) 156 (24.9) 11 (19.3) 0.436
Pac_Reposo = Si (%) 163 (26.0) 23 (40.4) 0.030
Pac_EPOC = Si (%) 55 (8.8) 6 (10.5) 0.840
Pac_ACVglobal = Si (%) 38 (6.1) 3 (5.3) 1.000
Pac_Hemorragia_Previa_Mayor_Todas = Si (%) 28 (4.5) 1 (1.8) 0.529
Pac_Hemorragia_Previa_Mayor_Reciente = Si (%) 18 (2.9) 1 (1.8) 0.944
Pac_EnfAuto = Si (%) 32 (5.1) 3 (5.3) 1.000
Pac_IRCglobal = Si (%) 52 (8.3) 2 (3.5) 0.305
Pac_SmeProcoag = Si (%) 27 (4.3) 0 (0.0) 0.214
PESI_Cancer = Si (%) 174 (27.8) 16 (28.1) 1.000
Pac_ACO_Previa = Si (%) 60 (9.6) 4 (7.0) 0.692
Peso (mean (SD)) 82.34 (19.69) 83.79 (17.99) 0.592
IMC (mean (SD)) 29.60 (6.46) 29.79 (6.68) 0.826
MotInt (%) 0.192
Otros 24 (3.8) 1 (1.8)
Patología clínica 60 (9.6) 9 (15.8)
Patología quirúrgica 54 (8.6) 9 (15.8)
TEP 450 (71.8) 34 (59.6)
Trauma 18 (2.9) 1 (1.8)
TVP 21 (3.3) 3 (5.3)
PESI_Det_Sens = Si (%) 31 (4.9) 3 (5.3) 1.000
CC_Horas_Sx_Admision (mean (SD)) 114.51 (217.34) 138.12 (181.06) 0.427
CC_FC_Ingreso (median [IQR]) 96.00 [80.00, 110.00] 104.00 [90.00, 120.00] 0.009 nonnorm
PESI_Taquicardia = Si (%) 228 (36.4) 30 (52.6) 0.022
CC_TAS_Ingreso (median [IQR]) 120.00 [110.00, 140.00] 120.00 [100.00, 130.00] 0.050 nonnorm
PESI_Hipotension = Si (%) 65 (10.4) 14 (24.6) 0.003
CC_FR_Ingreso (mean (SD)) 21.73 (5.35) 22.49 (5.68) 0.309
PESI_Taquipnea = Si (%) 283 (45.1) 34 (59.6) 0.049
PESI_Hipotermia = Si (%) 43 (6.9) 4 (7.0) 1.000
CC_SaO_Ingreso (mean (SD)) 92.55 (5.55) 90.00 (9.13) 0.002
CC_SaO90 = Si (%) 153 (24.4) 21 (36.8) 0.057
Wells (median [IQR]) 4.00 [2.50, 6.00] 4.50 [1.50, 6.00] 0.901 nonnorm
PESIcalc (median [IQR]) 93.00 [75.00, 115.00] 91.00 [75.00, 110.00] 0.975 nonnorm
Pac_Cx_Total = Si (%) 143 (22.8) 21 (36.8) 0.027
Lab_Hb (median [IQR]) 12.30 [10.95, 13.80] 12.00 [9.00, 13.30] 0.089 nonnorm
Lab_GB (mean (SD)) 10,994.84 (7,128.91) 13,137.26 (8,486.09) 0.033
Lab_Cr (median [IQR]) 0.91 [0.72, 1.19] 0.90 [0.70, 1.25] 0.831 nonnorm
Lab_Plaq (median [IQR]) 205,000.00 [159,000.00, 271,000.00] 218,000.00 [162,000.00, 272,000.00] 0.784 nonnorm
Biomarc_pos = Si (%) 333 (53.1) 39 (68.4) 0.037
ECOTT_FSVI (%) 0.942
Deprimida 21 (3.3) 1 (1.8)
Leve 38 (6.1) 4 (7.0)
Moderada 16 (2.6) 1 (1.8)
Normal 524 (83.6) 49 (86.0)
Severa 28 (4.5) 2 (3.5)
ECOTT_TAPSE (median [IQR]) 20.00 [15.00, 22.00] 15.00 [12.00, 20.00] <0.001 nonnorm
ECOTT_PSAP (median [IQR]) 41.00 [32.00, 54.00] 45.00 [37.00, 60.00] 0.015 nonnorm
ECOTT_DisfVD = Si (%) 212 (33.8) 31 (54.4) 0.003
Alta_Carga_Trombo_TAC = Si (%) 546 (87.1) 49 (86.0) 0.973
Int_O_Alto_Riesgo_Calc = Si (%) 385 (61.4) 43 (75.4) 0.051
EstRiesgo (%) <0.001
Alto riesgo 82 (13.1) 22 (38.6)
Bajo riesgo 156 (24.9) 9 (15.8)
Intermedio-alto riesgo 162 (25.8) 18 (31.6)
Intermedio-bajo riesgo 227 (36.2) 8 (14.0)
ServicioCargo = Otro (%) 148 (23.6) 20 (35.1) 0.077
RIETE_Calc (median [IQR]) 2.50 [1.00, 3.50] 2.50 [1.00, 3.50] 0.709 nonnorm
HASBLED (mean (SD)) 1.17 (1.02) 1.18 (1.04) 0.995
ACOint = Si (%) 606 (96.7) 55 (96.5) 1.000
FVCI = Si (%) 43 (6.9) 3 (5.3) 0.854
Tto_Reperf = Si (%) 76 (12.1) 15 (26.3) 0.005
TL_cual (%) <0.001
Alteplase 25 (4.0) 5 (8.8)
Estreptokinasa 39 (6.2) 9 (15.8)
Ninguno 532 (84.8) 35 (61.4)
No 31 (4.9) 8 (14.0)
Compl_Sang_Todos = Si (%) 0 (0.0) 57 (100.0) <0.001
Compl_SoporteHD_NO = Si (%) 88 (14.0) 24 (42.1) <0.001
TiempoInt (median [IQR]) 8.00 [5.00, 13.50] 9.00 [5.00, 13.00] 0.830 nonnorm
Alta_Tto_TiposACO (%) <0.001
AVK 328 (52.3) 20 (35.1)
DOACs 107 (17.1) 1 (1.8)
HBPM 109 (17.4) 14 (24.6)
Obito 70 (11.2) 13 (22.8)
Sin ACO 13 (2.1) 9 (15.8)
DOAC_si_vs_no = Si (%) 107 (17.1) 1 (1.8) 0.004
miss.univ (mean (SD)) 0.00 (0.00) 0.00 (0.00) NaN
ClCr (mean (SD)) 90.89 (49.74) 94.37 (48.43) 0.612
Pac_Edad_Corte = Si (%) 185 (29.5) 14 (24.6) 0.526
Lab_Plaq_Corte = Si (%) 605 (96.5) 51 (89.5) 0.027
TEP_motivo_int = Si (%) 450 (71.8) 34 (59.6) 0.076
NA

5) Análisis de outliers (I)

a) Boxplots de la variable Compl_Sangrado por variables consideradas clinicamente significativas:

  • A fin de detectar valores atípicos, se optó por efectuar scatterplots individuales para algunas variables clinicamente significativas agrupándolas según complicación de sangrado: edad, hemoglobina (Hb), recuento de plaquetas y score de PESI.
#ANÁLISIS GRAFICO EXPLORATORIO según COMPLICACION_SANGRADO

##Boxplot de Complicación de sangrado según RIETE calculado (RIETE_Calc)
ggplot(base_imp, aes(x=Compl_Sang_Todos, y=RIETE_Calc, fill = Compl_Sang_Todos)) + 
  geom_boxplot() + 
  geom_jitter(shape=16, position=position_jitter(0.2))



##Boxplot de Sexo según RIETE calculado (RIETE_Calc)
ggplot(base_imp, aes(x=Pac_Sex, y=RIETE_Calc, fill = Pac_Sex)) + 
  geom_boxplot() +
  geom_jitter(shape=16, position=position_jitter(0.2))



##Boxplot de Complicación de sangrado según hemoglobina (Hb)
ggplot(base, aes(x=Compl_Sang_Todos, y=Lab_Hb, fill = Compl_Sang_Todos)) + 
  geom_boxplot() +
  geom_jitter(shape=16, position=position_jitter(0.2))



##Boxplot de Complicación de sangrado según recuento de Plaquetas
ggplot(base_imp, aes(x=Compl_Sang_Todos, y=Lab_Plaq, fill = Compl_Sang_Todos)) + 
  geom_boxplot()



##Boxplot de Complicación de sangrado según score de PESI calculado (PESI_Calc)
ggplot(base_imp, aes(x=Compl_Sang_Todos, y=PESIcalc, fill = Compl_Sang_Todos)) + 
  geom_boxplot()



##Boxplot de Complicación de sangrado según Edad
ggplot(base_imp, aes(x=Compl_Sang_Todos, y=Pac_Edad, fill = Compl_Sang_Todos)) + 
  geom_boxplot() +
  geom_jitter(shape=16, position=position_jitter(0.2))

NA
NA
NA
  • Se observan outliers en tres variables: Lab_GB, Lab_Plaq y PESI_Calc. Específicamente, hay varios valores que superan el valor del tercer cuartil en Lab_Plaq, con individuos teniendo más de 450.000 plaquetas y varios pacientes que presentaron niveles atípicos de PESI (aproximadamente >170), y un solo valor atípico menor al primer cuartil (<25 de PESI).
  • Además se ven algunso sujetos con muy alto valor de GB, por lo cual serán estudiados.
max(base_imp$Lab_Plaq, na.rm = T)
[1] 731000
max(base_imp$PESIcalc)
[1] 239
max(base_imp$Lab_GB)
[1] 108000
min((base_imp$PESIcalc))
[1] 16
library(tidyverse)
library(dplyr)

atipicos_plaq <- base_imp %>% 
  filter(Lab_Plaq >= 450000)

atipicos_PESI<- base_imp %>% 
    filter(PESIcalc >= 170) %>%
    mutate(PESI = PESIcalc, Edad  = Pac_Edad, Sexo = Pac_Sex,
            ICC = Pac_ICC, EPOC = Pac_EPOC, FC = CC_FC_Ingreso,
            TAS = CC_TAS_Ingreso, FR = CC_FR_Ingreso, Sat02 = CC_SaO_Ingreso) %>%
    dplyr::select(PESI, Edad, Sexo, ICC, EPOC, FC, TAS, FR, Sat02)

atipicos_PESI2 <- base_imp %>% 
    filter(PESIcalc == 16)

atipicos_GB <- base_imp %>% 
    filter(base_imp$Lab_GB >60000)
  • Se tomaron en cuenta las valores outliers (mayores al Q3) aproximados de las variables, y se estudio el caso con PESIcalc igual a 16. No se observaron casos mal cargados ni con mucha influencia por lo tanto todos estos casos se consideraron válidos y quedarán en la base de datos.

6) Analisis univariado y analisis de sensibilidad

a) Analisis univariado

  • Como primer método de análisis se elige la regresión logística univariada de todas las variables. Se utlizó un nivel de significancia de 0.2 para tener a la variable en consideración para un modelo logístico multiple.
base_univ <- base_imp

# Se convierte en factor la variable ICC
base_univ$Pac_ICC <- as.factor (base_univ$Pac_ICC)
summary(base_univ$Pac_ICC)
 No  Si 
606  78 
#Se convierte variable *Compl_Sang_Todos en factor:

logistic.display((glm(Compl_Sang_Todos ~ CC_FC_Ingreso, data = base_univ, family = binomial (link = logit))))#0.024

Logistic regression predicting Compl_Sang_Todos : Si vs No 
 
                           OR(95%CI)      P(Wald's test) P(LR-test)
CC_FC_Ingreso (cont. var.) 1.01 (1,1.03)  0.025          0.027     
                                                                   
Log-likelihood = -193.7461
No. of observations = 684
AIC value = 391.4922
logistic.display(glm(Compl_Sang_Todos ~ CC_TAS_Ingreso, data = base_univ, family = binomial (link = logit)))#0.008

Logistic regression predicting Compl_Sang_Todos : Si vs No 
 
                            OR(95%CI)      P(Wald's test) P(LR-test)
CC_TAS_Ingreso (cont. var.) 0.98 (0.97,1)  0.007          0.007     
                                                                    
Log-likelihood = -192.5485
No. of observations = 684
AIC value = 389.097
logistic.display(glm(Compl_Sang_Todos ~ CC_SaO_Ingreso, data = base_univ, family = binomial (link = logit)))#0.0009

Logistic regression predicting Compl_Sang_Todos : Si vs No 
 
                            OR(95%CI)         P(Wald's test) P(LR-test)
CC_SaO_Ingreso (cont. var.) 0.94 (0.91,0.98)  0.003          0.004     
                                                                       
Log-likelihood = -192.1462
No. of observations = 684
AIC value = 388.2923
logistic.display(glm(Compl_Sang_Todos ~ Lab_Hb, data = base_univ, family = binomial (link = logit)))#0.02

Logistic regression predicting Compl_Sang_Todos : Si vs No 
 
                    OR(95%CI)         P(Wald's test) P(LR-test)
Lab_Hb (cont. var.) 0.86 (0.76,0.97)  0.016          0.016     
                                                               
Log-likelihood = -193.2753
No. of observations = 684
AIC value = 390.5507
logistic.display(glm(Compl_Sang_Todos ~ Lab_GB, data = base_univ, family = binomial (link = logit)))#0.04

Logistic regression predicting Compl_Sang_Todos : Si vs No 
 
                    OR(95%CI) P(Wald's test) P(LR-test)
Lab_GB (cont. var.) 1 (1,1)   0.055          0.078     
                                                       
Log-likelihood = -194.6429
No. of observations = 684
AIC value = 393.2858
logistic.display(glm(Compl_Sang_Todos ~ CC_TAS_Ingreso, data = base_univ, family = binomial (link = logit)))#0.008

Logistic regression predicting Compl_Sang_Todos : Si vs No 
 
                            OR(95%CI)      P(Wald's test) P(LR-test)
CC_TAS_Ingreso (cont. var.) 0.98 (0.97,1)  0.007          0.007     
                                                                    
Log-likelihood = -192.5485
No. of observations = 684
AIC value = 389.097
logistic.display(glm(Compl_Sang_Todos ~ CC_SaO_Ingreso, data = base_univ, family = binomial (link = logit)))#0.0009

Logistic regression predicting Compl_Sang_Todos : Si vs No 
 
                            OR(95%CI)         P(Wald's test) P(LR-test)
CC_SaO_Ingreso (cont. var.) 0.94 (0.91,0.98)  0.003          0.004     
                                                                       
Log-likelihood = -192.1462
No. of observations = 684
AIC value = 388.2923
logistic.display(glm(Compl_Sang_Todos ~ PESIcalc, data = base_univ, family = binomial (link = logit)))#0.0004

Logistic regression predicting Compl_Sang_Todos : Si vs No 
 
                      OR(95%CI)              P(Wald's test) P(LR-test)
PESIcalc (cont. var.) 0.9991 (0.9913,1.007)  0.824          0.823     
                                                                      
Log-likelihood = -196.1708
No. of observations = 684
AIC value = 396.3415
logistic.display(glm(Compl_Sang_Todos ~ Biomarc_pos, data = base_univ, family = binomial (link = logit)))#0.03

Logistic regression predicting Compl_Sang_Todos : Si vs No 
 
                      OR(95%CI)         P(Wald's test) P(LR-test)
Biomarc_pos: Si vs No 1.91 (1.07,3.42)  0.028          0.024     
                                                                 
Log-likelihood = -193.656
No. of observations = 684
AIC value = 391.312
logistic.display(glm(Compl_Sang_Todos ~ ECOTT_DisfVD, data = base_univ, family = binomial (link = logit)))#0.008

Logistic regression predicting Compl_Sang_Todos : Si vs No 
 
                       OR(95%CI)         P(Wald's test) P(LR-test)
ECOTT_DisfVD: Si vs No 2.33 (1.35,4.03)  0.002          0.002     
                                                                  
Log-likelihood = -191.5867
No. of observations = 684
AIC value = 387.1735
base_univ$Compl_Sang_Todos <- as.factor(base_univ$Compl_Sang_Todos)

summary(glm(Compl_Sang_Todos ~ Pac_ICC, data = base_univ, family = binomial (link = logit))) #0.13

Call:
glm(formula = Compl_Sang_Todos ~ Pac_ICC, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.465  -0.411  -0.411  -0.411   2.243  

Coefficients:
            Estimate Std. Error z value            Pr(>|z|)    
(Intercept)   -2.431      0.149  -16.31 <0.0000000000000002 ***
Pac_ICCSi      0.262      0.402    0.65                0.51    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.99  on 682  degrees of freedom
AIC: 396

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Pac_Deamb, data = base_univ, family = binomial (link = logit))) #0.10

Call:
glm(formula = Compl_Sang_Todos ~ Pac_Deamb, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.432  -0.432  -0.432  -0.369   2.332  

Coefficients:
            Estimate Std. Error z value            Pr(>|z|)    
(Intercept)   -2.326      0.154  -15.06 <0.0000000000000002 ***
Pac_DeambSi   -0.326      0.348   -0.94                0.35    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.47  on 682  degrees of freedom
AIC: 395.5

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Pac_ACVglobal, data = base_univ, family = binomial (link = logit)))#0.04

Call:
glm(formula = Compl_Sang_Todos ~ Pac_ACVglobal, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.419  -0.419  -0.419  -0.419   2.287  

Coefficients:
                Estimate Std. Error z value            Pr(>|z|)    
(Intercept)       -2.389      0.142  -16.81 <0.0000000000000002 ***
Pac_ACVglobalSi   -0.150      0.616   -0.24                0.81    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.33  on 682  degrees of freedom
AIC: 396.3

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Pac_Hemorragia_Previa_Mayor_Todas, data = base_univ, family = binomial (link = logit)))#0.02

Call:
glm(formula = Compl_Sang_Todos ~ Pac_Hemorragia_Previa_Mayor_Todas, 
    family = binomial(link = logit), data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.423  -0.423  -0.423  -0.423   2.595  

Coefficients:
                                    Estimate Std. Error z value            Pr(>|z|)    
(Intercept)                           -2.370      0.140  -16.96 <0.0000000000000002 ***
Pac_Hemorragia_Previa_Mayor_TodasSi   -0.962      1.027   -0.94                0.35    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.21  on 682  degrees of freedom
AIC: 395.2

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Pac_EnfAuto, data = base_univ, family = binomial (link = logit))) #0.2

Call:
glm(formula = Compl_Sang_Todos ~ Pac_EnfAuto, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.423  -0.417  -0.417  -0.417   2.230  

Coefficients:
              Estimate Std. Error z value            Pr(>|z|)    
(Intercept)    -2.3996     0.1421  -16.88 <0.0000000000000002 ***
Pac_EnfAutoSi   0.0325     0.6203    0.05                0.96    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.39  on 682  degrees of freedom
AIC: 396.4

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Pac_IRCglobal, data = base_univ, family = binomial (link = logit)))#0.02

Call:
glm(formula = Compl_Sang_Todos ~ Pac_IRCglobal, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.427  -0.427  -0.427  -0.427   2.567  

Coefficients:
                Estimate Std. Error z value            Pr(>|z|)    
(Intercept)       -2.347      0.141  -16.63 <0.0000000000000002 ***
Pac_IRCglobalSi   -0.911      0.734   -1.24                0.21    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 390.38  on 682  degrees of freedom
AIC: 394.4

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Pac_SmeProcoag, data = base_univ, family = binomial (link = logit)))#0.22

Call:
glm(formula = Compl_Sang_Todos ~ Pac_SmeProcoag, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.426  -0.426  -0.426  -0.426   2.211  

Coefficients:
                 Estimate Std. Error z value            Pr(>|z|)    
(Intercept)        -2.354      0.139  -16.98 <0.0000000000000002 ***
Pac_SmeProcoagSi  -15.212    761.367   -0.02                0.98    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 387.59  on 682  degrees of freedom
AIC: 391.6

Number of Fisher Scoring iterations: 16
summary(glm(Compl_Sang_Todos ~ Pac_Cx_Total, data = base_univ, family = binomial (link = logit)))#0.02

Call:
glm(formula = Compl_Sang_Todos ~ Pac_Cx_Total, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.523  -0.379  -0.379  -0.379   2.311  

Coefficients:
               Estimate Std. Error z value            Pr(>|z|)    
(Intercept)      -2.599      0.173  -15.04 <0.0000000000000002 ***
Pac_Cx_TotalSi    0.680      0.291    2.34               0.019 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 387.22  on 682  degrees of freedom
AIC: 391.2

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ PESI_Det_Sens, data = base_univ, family = binomial (link = logit)))#0.003

Call:
glm(formula = Compl_Sang_Todos ~ PESI_Det_Sens, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.430  -0.416  -0.416  -0.416   2.231  

Coefficients:
                Estimate Std. Error z value            Pr(>|z|)    
(Intercept)      -2.4013     0.1421  -16.90 <0.0000000000000002 ***
PESI_Det_SensSi   0.0659     0.6211    0.11                0.92    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.38  on 682  degrees of freedom
AIC: 396.4

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ PESI_Taquicardia, data = base_univ, family = binomial (link = logit)))#0.015

Call:
glm(formula = Compl_Sang_Todos ~ PESI_Taquicardia, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.497  -0.497  -0.362  -0.362   2.349  

Coefficients:
                   Estimate Std. Error z value            Pr(>|z|)    
(Intercept)          -2.693      0.199  -13.54 <0.0000000000000002 ***
PESI_TaquicardiaSi    0.665      0.278    2.39               0.017 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 386.69  on 682  degrees of freedom
AIC: 390.7

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ PESI_Hipotension, data = base_univ, family = binomial (link = logit)))#0.015

Call:
glm(formula = Compl_Sang_Todos ~ PESI_Hipotension, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.625  -0.384  -0.384  -0.384   2.300  

Coefficients:
                   Estimate Std. Error z value            Pr(>|z|)    
(Intercept)          -2.570      0.158  -16.24 <0.0000000000000002 ***
PESI_HipotensionSi    1.035      0.334    3.09               0.002 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 384.06  on 682  degrees of freedom
AIC: 388.1

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ PESI_Taquipnea, data = base_univ, family = binomial (link = logit)))#0.03

Call:
glm(formula = Compl_Sang_Todos ~ PESI_Taquipnea, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.476  -0.476  -0.360  -0.360   2.354  

Coefficients:
                 Estimate Std. Error z value            Pr(>|z|)    
(Intercept)        -2.705      0.215  -12.56 <0.0000000000000002 ***
PESI_TaquipneaSi    0.586      0.282    2.08               0.037 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 387.97  on 682  degrees of freedom
AIC: 392

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ PESI_Hipotermia, data = base_univ, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ PESI_Hipotermia, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.422  -0.417  -0.417  -0.417   2.230  

Coefficients:
                  Estimate Std. Error z value            Pr(>|z|)    
(Intercept)        -2.3996     0.1435  -16.73 <0.0000000000000002 ***
PESI_HipotermiaSi   0.0247     0.5421    0.05                0.96    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.39  on 682  degrees of freedom
AIC: 396.4

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ CC_SaO90, data = base_univ, family = binomial (link = logit)))#0.05

Call:
glm(formula = Compl_Sang_Todos ~ CC_SaO90, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.507  -0.383  -0.383  -0.383   2.303  

Coefficients:
            Estimate Std. Error z value            Pr(>|z|)    
(Intercept)   -2.578      0.173  -14.91 <0.0000000000000002 ***
CC_SaO90Si     0.592      0.290    2.04               0.041 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 388.43  on 682  degrees of freedom
AIC: 392.4

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ CC_Horas_Sx_Admision, data = base_univ, family = binomial (link = logit)))#0.12

Call:
glm(formula = Compl_Sang_Todos ~ CC_Horas_Sx_Admision, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.631  -0.417  -0.408  -0.407   2.252  

Coefficients:
                      Estimate Std. Error z value            Pr(>|z|)    
(Intercept)          -2.452547   0.157132  -15.61 <0.0000000000000002 ***
CC_Horas_Sx_Admision  0.000435   0.000550    0.79                0.43    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.83  on 682  degrees of freedom
AIC: 395.8

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ ECOTT_TAPSE, data = base_univ, family = binomial (link = logit)))#0.007

Call:
glm(formula = Compl_Sang_Todos ~ ECOTT_TAPSE, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.782  -0.447  -0.373  -0.326   2.848  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  -0.7457     0.4435   -1.68  0.09268 .  
ECOTT_TAPSE  -0.0941     0.0256   -3.68  0.00024 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 378.71  on 682  degrees of freedom
AIC: 382.7

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ ECOTT_PSAP, data = base_univ, family = binomial (link = logit)))#0.005

Call:
glm(formula = Compl_Sang_Todos ~ ECOTT_PSAP, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.706  -0.430  -0.393  -0.364   2.387  

Coefficients:
            Estimate Std. Error z value            Pr(>|z|)    
(Intercept) -3.15097    0.36085   -8.73 <0.0000000000000002 ***
ECOTT_PSAP   0.01574    0.00661    2.38               0.017 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 387.13  on 682  degrees of freedom
AIC: 391.1

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Int_O_Alto_Riesgo_Calc, data = base_univ, family = binomial (link = logit)))#0.04

Call:
glm(formula = Compl_Sang_Todos ~ Int_O_Alto_Riesgo_Calc, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.460  -0.460  -0.460  -0.335   2.411  

Coefficients:
                         Estimate Std. Error z value            Pr(>|z|)    
(Intercept)                -2.850      0.275  -10.37 <0.0000000000000002 ***
Int_O_Alto_Riesgo_CalcSi    0.658      0.318    2.07               0.039 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 387.74  on 682  degrees of freedom
AIC: 391.7

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ EstRiesgo, data = base_univ, family = binomial (link = logit)))#SIG todos

Call:
glm(formula = Compl_Sang_Todos ~ EstRiesgo, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.690  -0.459  -0.335  -0.263   2.600  

Coefficients:
                                Estimate Std. Error z value    Pr(>|z|)    
(Intercept)                       -1.316      0.240   -5.48 0.000000043 ***
EstRiesgoBajo riesgo              -1.537      0.419   -3.67     0.00024 ***
EstRiesgoIntermedio-alto riesgo   -0.882      0.346   -2.55     0.01073 *  
EstRiesgoIntermedio-bajo riesgo   -2.030      0.432   -4.69 0.000002689 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 364.02  on 680  degrees of freedom
AIC: 372

Number of Fisher Scoring iterations: 6
summary(glm(Compl_Sang_Todos ~ ServicioCargo, data = base_univ, family = binomial (link = logit)))#0.04

Call:
glm(formula = Compl_Sang_Todos ~ ServicioCargo, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.503  -0.386  -0.386  -0.386   2.296  

Coefficients:
                  Estimate Std. Error z value            Pr(>|z|)    
(Intercept)         -2.561      0.171  -15.01 <0.0000000000000002 ***
ServicioCargoOtro    0.559      0.293    1.91               0.056 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 388.93  on 682  degrees of freedom
AIC: 392.9

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ FVCI, data = base_univ, family = binomial (link = logit)))#0.0000

Call:
glm(formula = Compl_Sang_Todos ~ FVCI, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.421  -0.421  -0.421  -0.421   2.337  

Coefficients:
            Estimate Std. Error z value            Pr(>|z|)    
(Intercept)   -2.381      0.142  -16.74 <0.0000000000000002 ***
FVCISi        -0.282      0.614   -0.46                0.65    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.17  on 682  degrees of freedom
AIC: 396.2

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Tto_Reperf, data = base_univ, family = binomial (link = logit)))#0.003

Call:
glm(formula = Compl_Sang_Todos ~ Tto_Reperf, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.600  -0.383  -0.383  -0.383   2.301  

Coefficients:
             Estimate Std. Error z value            Pr(>|z|)    
(Intercept)    -2.574      0.160  -16.08 <0.0000000000000002 ***
Tto_ReperfSi    0.951      0.325    2.93              0.0034 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 384.81  on 682  degrees of freedom
AIC: 388.8

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ TL_cual, data = base_univ, family = binomial (link = logit)))#SIG dudoso

Call:
glm(formula = Compl_Sang_Todos ~ TL_cual, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.678  -0.357  -0.357  -0.357   2.360  

Coefficients:
                      Estimate Std. Error z value Pr(>|z|)   
(Intercept)             -1.609      0.490   -3.29    0.001 **
TL_cualEstreptokinasa    0.143      0.614    0.23    0.816   
TL_cualNinguno          -1.112      0.520   -2.14    0.033 * 
TL_cualNo                0.255      0.630    0.40    0.686   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 375.69  on 680  degrees of freedom
AIC: 383.7

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Compl_SoporteHD_NO, data = base_univ, family = binomial (link = logit)))#00000

Call:
glm(formula = Compl_Sang_Todos ~ Compl_SoporteHD_NO, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.695  -0.345  -0.345  -0.345   2.389  

Coefficients:
                     Estimate Std. Error z value             Pr(>|z|)    
(Intercept)            -2.793      0.179  -15.58 < 0.0000000000000002 ***
Compl_SoporteHD_NOSi    1.494      0.292    5.12           0.00000031 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 368.72  on 682  degrees of freedom
AIC: 372.7

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Alta_Tto_TiposACO, data = base_univ, family = binomial (link = logit)))#SIG todos

Call:
glm(formula = Compl_Sang_Todos ~ Alta_Tto_TiposACO, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-1.026  -0.492  -0.344  -0.344   3.060  

Coefficients:
                         Estimate Std. Error z value             Pr(>|z|)    
(Intercept)                -2.797      0.230  -12.15 < 0.0000000000000002 ***
Alta_Tto_TiposACODOACs     -1.876      1.031   -1.82               0.0688 .  
Alta_Tto_TiposACOHBPM       0.745      0.366    2.04               0.0416 *  
Alta_Tto_TiposACOObito      1.114      0.380    2.93               0.0034 ** 
Alta_Tto_TiposACOSin ACO    2.430      0.491    4.95           0.00000075 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 353.45  on 679  degrees of freedom
AIC: 363.4

Number of Fisher Scoring iterations: 7
summary(glm(Compl_Sang_Todos ~ DOAC_si_vs_no, data = base_univ, family = binomial (link = logit)))#0.016

Call:
glm(formula = Compl_Sang_Todos ~ DOAC_si_vs_no, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.452  -0.452  -0.452  -0.452   3.060  

Coefficients:
                Estimate Std. Error z value            Pr(>|z|)    
(Intercept)       -2.228      0.141  -15.85 <0.0000000000000002 ***
DOAC_si_vs_noSi   -2.444      1.014   -2.41               0.016 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 378.77  on 682  degrees of freedom
AIC: 382.8

Number of Fisher Scoring iterations: 7
summary(glm(Compl_Sang_Todos ~ Wells, data = base_univ, family = binomial (link = logit)))#0.005

Call:
glm(formula = Compl_Sang_Todos ~ Wells, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.427  -0.419  -0.417  -0.413   2.243  

Coefficients:
            Estimate Std. Error z value            Pr(>|z|)    
(Intercept) -2.43015    0.28273   -8.60 <0.0000000000000002 ***
Wells        0.00781    0.05948    0.13                 0.9    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.37  on 682  degrees of freedom
AIC: 396.4

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ TiempoInt, data = base_univ, family = binomial (link = logit)))#0.01

Call:
glm(formula = Compl_Sang_Todos ~ TiempoInt, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.417  -0.417  -0.417  -0.417   2.229  

Coefficients:
                            Estimate               Std. Error z value            Pr(>|z|)    
(Intercept) -2.397895272798302723771  0.165923787216863627414   -14.4 <0.0000000000000002 ***
TiempoInt   -0.000000000000000000792  0.006454429735504717269     0.0                   1    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.39  on 682  degrees of freedom
AIC: 396.4

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ HASBLED, data = base_univ, family = binomial (link = logit))) #0.062

Call:
glm(formula = Compl_Sang_Todos ~ HASBLED, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.418  -0.417  -0.417  -0.417   2.230  

Coefficients:
             Estimate Std. Error z value            Pr(>|z|)    
(Intercept) -2.398804   0.211572  -11.34 <0.0000000000000002 ***
HASBLED      0.000773   0.136191    0.01                   1    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.39  on 682  degrees of freedom
AIC: 396.4

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Alta_Carga_Trombo_TAC, data = base_univ, family = binomial (link = logit))) #0.16

Call:
glm(formula = Compl_Sang_Todos ~ Alta_Carga_Trombo_TAC, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.434  -0.415  -0.415  -0.415   2.235  

Coefficients:
                        Estimate Std. Error z value      Pr(>|z|)    
(Intercept)              -2.3150     0.3706   -6.25 0.00000000042 ***
Alta_Carga_Trombo_TACSi  -0.0958     0.3995   -0.24          0.81    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.34  on 682  degrees of freedom
AIC: 396.3

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ ClCr, data = base_univ, family = binomial (link = logit))) #0.53

Call:
glm(formula = Compl_Sang_Todos ~ ClCr, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.489  -0.423  -0.412  -0.406   2.268  

Coefficients:
            Estimate Std. Error z value            Pr(>|z|)    
(Intercept) -2.52418    0.28821   -8.76 <0.0000000000000002 ***
ClCr         0.00136    0.00269    0.51                0.61    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.14  on 682  degrees of freedom
AIC: 396.1

Number of Fisher Scoring iterations: 5
#NO SIGNIFICATIVAS:
summary(glm(Compl_Sang_Todos ~ Pac_Edad, data = base_univ, family = binomial (link = logit)))#0.81

Call:
glm(formula = Compl_Sang_Todos ~ Pac_Edad, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.526  -0.433  -0.404  -0.382   2.347  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -1.73690    0.50595   -3.43   0.0006 ***
Pac_Edad    -0.01057    0.00794   -1.33   0.1834    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 390.66  on 682  degrees of freedom
AIC: 394.7

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Pac_HTA, data = base_univ, family = binomial (link = logit)))#0.76

Call:
glm(formula = Compl_Sang_Todos ~ Pac_HTA, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.442  -0.442  -0.397  -0.397   2.272  

Coefficients:
            Estimate Std. Error z value            Pr(>|z|)    
(Intercept)   -2.277      0.198  -11.48 <0.0000000000000002 ***
Pac_HTASi     -0.225      0.277   -0.81                0.42    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.73  on 682  degrees of freedom
AIC: 395.7

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Pac_DBT, data = base_univ, family = binomial (link = logit)))#0.39

Call:
glm(formula = Compl_Sang_Todos ~ Pac_DBT, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.464  -0.409  -0.409  -0.409   2.246  

Coefficients:
            Estimate Std. Error z value            Pr(>|z|)    
(Intercept)   -2.440      0.152  -16.04 <0.0000000000000002 ***
Pac_DBTSi      0.265      0.367    0.72                0.47    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.89  on 682  degrees of freedom
AIC: 395.9

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Pac_TBQ, data = base_univ, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Pac_TBQ, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.449  -0.406  -0.405  -0.405   2.256  

Coefficients:
                  Estimate Std. Error z value     Pr(>|z|)    
(Intercept)       -2.45674    0.42538   -5.78 0.0000000077 ***
Pac_TBQNo         -0.00518    0.46243   -0.01         0.99    
Pac_TBQTabaquista  0.21131    0.49233    0.43         0.67    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.88  on 681  degrees of freedom
AIC: 397.9

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Pac_DLP, data = base_univ, family = binomial (link = logit)))#0.22

Call:
glm(formula = Compl_Sang_Todos ~ Pac_DLP, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.433  -0.433  -0.433  -0.378   2.313  

Coefficients:
            Estimate Std. Error z value            Pr(>|z|)    
(Intercept)   -2.321      0.160  -14.52 <0.0000000000000002 ***
Pac_DLPSi     -0.282      0.320   -0.88                0.38    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.58  on 682  degrees of freedom
AIC: 395.6

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Pac_FA, data = base_univ, family = binomial (link = logit)))#0.29

Call:
glm(formula = Compl_Sang_Todos ~ Pac_FA, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.417  -0.417  -0.417  -0.417   2.229  

Coefficients:
                        Estimate           Std. Error z value            Pr(>|z|)    
(Intercept) -2.39789527279830450  0.14346840499509481   -16.7 <0.0000000000000002 ***
Pac_FASi    -0.00000000000000103  0.54158135220267112     0.0                   1    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.39  on 682  degrees of freedom
AIC: 396.4

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Pac_ETVpre, data = base_univ, family = binomial (link = logit)))#0.47

Call:
glm(formula = Compl_Sang_Todos ~ Pac_ETVpre, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.440  -0.440  -0.440  -0.292   2.521  

Coefficients:
             Estimate Std. Error z value            Pr(>|z|)    
(Intercept)    -2.287      0.146  -15.71 <0.0000000000000002 ***
Pac_ETVpreSi   -0.848      0.479   -1.77               0.077 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 388.54  on 682  degrees of freedom
AIC: 392.5

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Pac_TEP_previo_menor_3_meses, data = base_univ, family = binomial (link = logit)))#0.47

Call:
glm(formula = Compl_Sang_Todos ~ Pac_TEP_previo_menor_3_meses, 
    family = binomial(link = logit), data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.419  -0.419  -0.419  -0.419   2.225  

Coefficients:
                               Estimate Std. Error z value            Pr(>|z|)    
(Intercept)                      -2.388      0.138  -17.26 <0.0000000000000002 ***
Pac_TEP_previo_menor_3_mesesSi  -13.178    594.164   -0.02                0.98    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.34  on 682  degrees of freedom
AIC: 395.3

Number of Fisher Scoring iterations: 14
summary(glm(Compl_Sang_Todos ~ Pac_Reposo, data = base_univ, family = binomial (link = logit)))#0.88

Call:
glm(formula = Compl_Sang_Todos ~ Pac_Reposo, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.514  -0.376  -0.376  -0.376   2.317  

Coefficients:
             Estimate Std. Error z value            Pr(>|z|)    
(Intercept)    -2.614      0.178   -14.7 <0.0000000000000002 ***
Pac_ReposoSi    0.655      0.285     2.3               0.021 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 387.33  on 682  degrees of freedom
AIC: 391.3

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Pac_EPOC, data = base_univ, family = binomial (link = logit)))#0.66

Call:
glm(formula = Compl_Sang_Todos ~ Pac_EPOC, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.455  -0.413  -0.413  -0.413   2.237  

Coefficients:
            Estimate Std. Error z value            Pr(>|z|)    
(Intercept)   -2.417      0.146  -16.54 <0.0000000000000002 ***
Pac_EPOCSi     0.202      0.454    0.44                0.66    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.20  on 682  degrees of freedom
AIC: 396.2

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ PESI_Cancer, data = base_univ, family = binomial (link = logit)))#0.57

Call:
glm(formula = Compl_Sang_Todos ~ PESI_Cancer, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.419  -0.419  -0.416  -0.416   2.231  

Coefficients:
              Estimate Std. Error z value            Pr(>|z|)    
(Intercept)    -2.4023     0.1631  -14.73 <0.0000000000000002 ***
PESI_CancerSi   0.0159     0.3080    0.05                0.96    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.39  on 682  degrees of freedom
AIC: 396.4

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Pac_ACO_Previa, data = base_univ, family = binomial (link = logit)))#0.75

Call:
glm(formula = Compl_Sang_Todos ~ Pac_ACO_Previa, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.423  -0.423  -0.423  -0.423   2.355  

Coefficients:
                 Estimate Std. Error z value            Pr(>|z|)    
(Intercept)        -2.370      0.144  -16.50 <0.0000000000000002 ***
Pac_ACO_PreviaSi   -0.338      0.536   -0.63                0.53    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.96  on 682  degrees of freedom
AIC: 396

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ MotInt, data = base_univ, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ MotInt, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.555  -0.382  -0.382  -0.382   2.537  

Coefficients:
                           Estimate Std. Error z value Pr(>|z|)   
(Intercept)                  -3.178      1.020   -3.11   0.0018 **
MotIntPatología clínica       1.281      1.081    1.18   0.2361   
MotIntPatología quirúrgica    1.386      1.082    1.28   0.2001   
MotIntTEP                     0.595      1.036    0.57   0.5655   
MotIntTrauma                  0.288      1.448    0.20   0.8425   
MotIntTVP                     1.232      1.193    1.03   0.3015   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 385.57  on 678  degrees of freedom
AIC: 397.6

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ ACOint, data = base_univ, family = binomial (link = logit)))#0.4108

Call:
glm(formula = Compl_Sang_Todos ~ ACOint, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.426  -0.417  -0.417  -0.417   2.230  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)   
(Intercept)  -2.3514     0.7400   -3.18   0.0015 **
ACOintSi     -0.0482     0.7533   -0.06   0.9490   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.39  on 682  degrees of freedom
AIC: 396.4

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ IMC, data = base_univ, family = binomial (link = logit)))#0.549

Call:
glm(formula = Compl_Sang_Todos ~ IMC, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.444  -0.419  -0.415  -0.412   2.249  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -2.53584    0.64446   -3.93 0.000083 ***
IMC          0.00465    0.02114    0.22     0.83    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.34  on 682  degrees of freedom
AIC: 396.3

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ CC_FR_Ingreso, data = base_univ, family = binomial (link = logit)))#0.35

Call:
glm(formula = Compl_Sang_Todos ~ CC_FR_Ingreso, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.535  -0.427  -0.407  -0.397   2.392  

Coefficients:
              Estimate Std. Error z value   Pr(>|z|)    
(Intercept)    -2.9534     0.5702   -5.18 0.00000022 ***
CC_FR_Ingreso   0.0251     0.0247    1.02       0.31    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.38  on 682  degrees of freedom
AIC: 395.4

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Lab_Plaq, data = base_univ, family = binomial (link = logit)))#0.88

Call:
glm(formula = Compl_Sang_Todos ~ Lab_Plaq, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.430  -0.418  -0.416  -0.415   2.240  

Coefficients:
                Estimate   Std. Error z value        Pr(>|z|)    
(Intercept) -2.426699776  0.356392408   -6.81 0.0000000000098 ***
Lab_Plaq     0.000000129  0.000001466    0.09            0.93    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.38  on 682  degrees of freedom
AIC: 396.4

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ ECOTT_FSVI, data = base_univ, family = binomial (link = logit)))# NO SIGN

Call:
glm(formula = Compl_Sang_Todos ~ ECOTT_FSVI, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.447  -0.423  -0.423  -0.423   2.486  

Coefficients:
                   Estimate Std. Error z value Pr(>|z|)   
(Intercept)          -3.045      1.023   -2.97   0.0029 **
ECOTT_FSVILeve        0.793      1.151    0.69   0.4905   
ECOTT_FSVIModerada    0.272      1.453    0.19   0.8515   
ECOTT_FSVINormal      0.675      1.034    0.65   0.5141   
ECOTT_FSVISevera      0.405      1.258    0.32   0.7473   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.53  on 679  degrees of freedom
AIC: 401.5

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ RIETE_Calc, data = base_univ, family = binomial (link = logit)))#0.52

Call:
glm(formula = Compl_Sang_Todos ~ RIETE_Calc, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.457  -0.428  -0.416  -0.400   2.265  

Coefficients:
            Estimate Std. Error z value            Pr(>|z|)    
(Intercept)   -2.541      0.301   -8.44 <0.0000000000000002 ***
RIETE_Calc     0.056      0.103    0.55                0.59    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.10  on 682  degrees of freedom
AIC: 396.1

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Lab_Cr, data = base_univ, family = binomial (link = logit)))#0.37

Call:
glm(formula = Compl_Sang_Todos ~ Lab_Cr, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.663  -0.419  -0.411  -0.404   2.278  

Coefficients:
            Estimate Std. Error z value            Pr(>|z|)    
(Intercept)   -2.587      0.261   -9.91 <0.0000000000000002 ***
Lab_Cr         0.174      0.199    0.88                0.38    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.70  on 682  degrees of freedom
AIC: 395.7

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Peso, data = base_univ, family = binomial (link = logit)))#0.37

Call:
glm(formula = Compl_Sang_Todos ~ Peso, family = binomial(link = logit), 
    data = base_univ)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.470  -0.422  -0.415  -0.404   2.280  

Coefficients:
            Estimate Std. Error z value  Pr(>|z|)    
(Intercept) -2.70670    0.59582   -4.54 0.0000056 ***
Peso         0.00372    0.00693    0.54      0.59    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.11  on 682  degrees of freedom
AIC: 396.1

Number of Fisher Scoring iterations: 5
  • Decidimos explorar las variables cuantitativas que no son significativas y realizar transformaciones para ver si se ajustan a un modelo de regresión logística. Para ello verificamos primero cuales no cumplen el supuesto de linealidad de los logits

b) Supuesto linealidad de logit

base_logit <- base_imp[,!names(base_imp) %in% c("TEP_motivo_int", "miss.univ","DOAC_si_vs_no")]
m_logits <- glm (Compl_Sang_Todos ~. , data = base_logit, family = binomial (link = logit))
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
# Predict the probability (p) of diabete positivity
probabilities <- predict(m_logits, type = "response")
predicted.classes <- ifelse(probabilities > 0.3, "pos", "neg")
head(predicted.classes)
    1     2     3     4     5     6 
"pos" "neg" "pos" "neg" "neg" "neg" 
#1) Remove qualitative variables from the original data frame and bind the logit values to the data:
# Select only numeric predictors

mydata <- base_logit %>%
  dplyr::select_if(is.numeric) 
predictors <- colnames(mydata)
# Bind the logit and tidying the data for plot
mydata <- mydata %>%
  mutate(logit = log(probabilities/(1-probabilities))) %>%
  gather(key = "predictors", value = "predictor.value", -logit)

#2)
ggplot(mydata, aes(predictor.value, logit))+
  geom_point(size = 0.5, alpha = 0.3) +
  geom_smooth(method = "loess") + 
  theme_bw() + 
  facet_wrap(~predictors, scales = "free_x")


#realizamos transformaciones logisticas de las variables ClCr, Plaquetas, Peso, Saturacion O2, GB
base_logit2 <- base_logit
base_logit2$Log_FC<- log(base_logit2$CC_FC_Ingreso)
base_logit2$Log_TAS<- log(base_logit2$CC_TAS_Ingreso)
base_logit2$Log_ClCr<- log(base_logit2$ClCr)
base_logit2$Log_CC_SaO_Ingreso<- log(base_logit2$CC_SaO_Ingreso)
base_logit2$Log_Lab_Plaq<- log(base_logit2$Lab_Plaq)
base_logit2$Log_Lab_GB<- log(base_logit2$Lab_GB)
base_logit2$Log_Peso<- log(base_logit2$Peso)
base_logit2$Dias_Sx_Admision <- base_logit2$CC_Horas_Sx_Admision/24

base_logit2 <- base_logit2[,!names(base_logit2) %in% c("ClCr", "CC_SaO_Ingreso", "Lab_Plaq", "Lab_GB", "Peso", "CC_Horas_Sx_Admision", "CC_FC_Ingreso", "CC_TAS_Ingreso")]

base_logit2$Compl_Sang_Todos <- as.factor(base_logit2$Compl_Sang_Todos)
levels(base_logit2$Compl_Sang_Todos) <- c("No", "Si")

#corremos devuelta el gráfico
m_logits2 <- glm (Compl_Sang_Todos ~. , data = base_logit2, family = binomial (link = logit))
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
str(base_logit2)
'data.frame':   684 obs. of  65 variables:
 $ Pac_Sex                             : Factor w/ 2 levels "Femenino","Masculino": 1 2 2 1 2 2 1 1 2 2 ...
 $ Pac_Edad                            : num  82 29 50 82 75 73 79 73 75 65 ...
 $ Pac_Cobertura                       : Factor w/ 4 levels "Estatal","Obra Social",..: 2 1 2 3 4 2 3 3 2 2 ...
 $ Pac_HTA                             : Factor w/ 2 levels "No","Si": 2 1 1 2 2 2 2 1 2 2 ...
 $ Pac_DBT                             : Factor w/ 2 levels "No","Si": 1 1 1 1 1 1 1 1 1 2 ...
 $ Pac_TBQ                             : Factor w/ 3 levels "Ex-tabaquista",..: 2 2 2 2 3 2 2 2 3 2 ...
 $ Pac_DLP                             : Factor w/ 2 levels "No","Si": 2 1 1 1 2 2 1 2 1 2 ...
 $ Pac_ICC                             : Factor w/ 2 levels "No","Si": 1 2 1 1 1 1 2 1 2 1 ...
 $ Pac_FA                              : Factor w/ 2 levels "No","Si": 1 1 1 1 1 1 2 1 1 1 ...
 $ Pac_ETVpre                          : Factor w/ 2 levels "No","Si": 1 2 1 1 1 1 1 1 1 1 ...
 $ Pac_TEP_previo_menor_3_meses        : Factor w/ 2 levels "No","Si": 1 1 1 1 1 1 1 1 1 1 ...
 $ Pac_Deamb                           : Factor w/ 2 levels "Ninguna","Si": 1 1 1 2 1 1 1 1 1 2 ...
 $ Pac_Reposo                          : Factor w/ 2 levels "No","Si": 1 1 2 1 1 2 1 1 2 1 ...
 $ Pac_EPOC                            : Factor w/ 2 levels "No","Si": 1 1 1 1 2 1 1 1 1 1 ...
 $ Pac_ACVglobal                       : Factor w/ 2 levels "No","Si": 1 1 2 1 1 1 1 1 1 1 ...
 $ Pac_Hemorragia_Previa_Mayor_Todas   : Factor w/ 2 levels "No","Si": 1 1 2 1 1 1 1 1 1 1 ...
 $ Pac_Hemorragia_Previa_Mayor_Reciente: Factor w/ 2 levels "No","Si": 1 1 2 1 1 1 1 1 1 1 ...
 $ Pac_EnfAuto                         : Factor w/ 2 levels "No","Si": 1 1 1 1 1 1 1 1 1 2 ...
 $ Pac_IRCglobal                       : Factor w/ 2 levels "No","Si": 1 1 1 1 1 1 1 1 1 1 ...
 $ Pac_SmeProcoag                      : Factor w/ 2 levels "No","Si": 1 1 1 1 1 1 1 1 1 1 ...
 $ PESI_Cancer                         : Factor w/ 2 levels "No","Si": 2 1 1 1 2 1 1 2 2 1 ...
 $ Pac_ACO_Previa                      : Factor w/ 2 levels "No","Si": 1 1 1 1 1 1 2 1 1 1 ...
 $ IMC                                 : num  29.3 27.7 26.4 23.4 31.1 ...
 $ MotInt                              : Factor w/ 6 levels "Otros","Patología clínica",..: 4 4 3 5 4 4 1 2 4 2 ...
 $ PESI_Det_Sens                       : Factor w/ 2 levels "No","Si": 1 1 1 1 1 1 1 1 1 1 ...
 $ PESI_Taquicardia                    : Factor w/ 2 levels "No","Si": 2 1 1 1 2 1 1 2 1 1 ...
 $ PESI_Hipotension                    : Factor w/ 2 levels "No","Si": 1 1 1 1 1 2 1 2 1 1 ...
 $ CC_FR_Ingreso                       : num  26 24 18 25 36 15 18 32 18 16 ...
 $ PESI_Taquipnea                      : Factor w/ 2 levels "No","Si": 2 2 1 2 2 1 1 2 1 1 ...
 $ PESI_Hipotermia                     : Factor w/ 2 levels "No","Si": 2 1 1 1 1 2 1 1 1 1 ...
 $ CC_SaO90                            : Factor w/ 2 levels "No","Si": 1 1 1 1 1 1 1 2 1 1 ...
 $ Wells                               : num  5.5 0 6 3 4.5 4.5 6 2.5 3 1 ...
 $ PESIcalc                            : num  53 54 119 80 90 42 120 102 67 160 ...
 $ Pac_Cx_Total                        : Factor w/ 2 levels "No","Si": 1 1 1 1 2 1 1 1 1 2 ...
 $ Lab_Hb                              : num  12 11.9 12 14.9 14.6 11.4 9.9 12.5 12.7 12.7 ...
 $ Lab_Cr                              : num  3 0.77 0.8 0.68 0.9 0.7 0.68 0.4 0.95 0.95 ...
 $ Biomarc_pos                         : Factor w/ 2 levels "No","Si": 1 2 2 2 2 2 2 1 1 1 ...
 $ ECOTT_FSVI                          : Factor w/ 5 levels "Deprimida","Leve",..: 4 4 4 4 4 4 4 4 4 5 ...
 $ ECOTT_TAPSE                         : num  19 24 15 21 18 22 13 9 16 25 ...
 $ ECOTT_PSAP                          : num  35 38 55 33 18 30 70 48 47 35 ...
 $ ECOTT_DisfVD                        : Factor w/ 2 levels "No","Si": 1 1 2 1 1 1 1 2 1 1 ...
 $ Alta_Carga_Trombo_TAC               : Factor w/ 2 levels "No","Si": 2 2 2 2 2 2 2 2 2 2 ...
 $ Int_O_Alto_Riesgo_Calc              : Factor w/ 2 levels "No","Si": 1 2 2 2 2 2 2 2 1 1 ...
 $ EstRiesgo                           : Factor w/ 4 levels "Alto riesgo",..: 2 4 3 4 4 4 4 1 4 2 ...
 $ ServicioCargo                       : Factor w/ 2 levels "Cardiología",..: 2 2 1 2 1 1 1 2 2 2 ...
 $ RIETE_Calc                          : num  2.5 3.5 2 2 2 1 3.5 2 5 4 ...
 $ HASBLED                             : num  2 2 1 0 2 3 1 2 2 0 ...
 $ ACOint                              : Factor w/ 2 levels "No","Si": 2 2 2 2 2 1 2 2 2 2 ...
 $ FVCI                                : Factor w/ 2 levels "No","Si": 1 1 1 1 1 2 1 1 1 1 ...
 $ Tto_Reperf                          : Factor w/ 2 levels "No","Si": 1 1 1 1 1 1 1 1 1 1 ...
 $ TL_cual                             : Factor w/ 4 levels "Alteplase","Estreptokinasa",..: 3 3 3 3 3 3 4 3 3 3 ...
 $ Compl_Sang_Todos                    : Factor w/ 2 levels "No","Si": 1 1 2 1 1 1 1 2 1 1 ...
 $ Compl_SoporteHD_NO                  : Factor w/ 2 levels "No","Si": 2 1 1 1 1 1 1 2 1 1 ...
 $ TiempoInt                           : num  5 3 18 68 11 36 54 46 11 11 ...
 $ Alta_Tto_TiposACO                   : Factor w/ 5 levels "AVK","DOACs",..: 3 1 3 1 1 3 5 1 2 2 ...
 $ Pac_Edad_Corte                      : chr  "Si" "No" "No" "Si" ...
 $ Lab_Plaq_Corte                      : chr  "No" "No" "No" "No" ...
 $ Log_FC                              : num  4.7 4.47 4.61 4.56 4.74 ...
 $ Log_TAS                             : num  4.67 4.87 4.79 4.79 4.7 ...
 $ Log_ClCr                            : num  2.9 5.08 5.23 4.32 4.5 ...
 $ Log_CC_SaO_Ingreso                  : num  4.6 4.54 4.55 4.53 4.53 ...
 $ Log_Lab_Plaq                        : num  9.78 9.8 10.09 10.13 10.31 ...
 $ Log_Lab_GB                          : num  9.54 9.15 9.18 9.44 9.45 ...
 $ Log_Peso                            : num  4.38 4.38 4.79 4.32 4.5 ...
 $ Dias_Sx_Admision                    : num  7 0.5 10 3 2 0.125 1 4 4 5 ...
# Predict the probability (p) of diabete positivity
probabilities2 <- predict(m_logits2, type = "response")
predicted.classes2 <- ifelse(probabilities2 > 0.3, "pos", "neg")
head(predicted.classes2)
    1     2     3     4     5     6 
"pos" "neg" "pos" "neg" "neg" "neg" 
#1) Remove qualitative variables from the original data frame and bind the logit values to the data:
# Select only numeric predictors
nombres <- c("Edad", "Frec. resp. al ingreso", "Hemoglobina", "TAPSE", "PSAP", "Logaritmo FC", "Logaritmo TAS", "Logaritmo ClCr", "Logaritmo Sat O2", "Logaritmo plaquetas", "Logaritmo GB", "Logaritmo Peso", "Dias desde inicio de sintomas hasta consulta")

mydata2 <- base_logit2 %>%
  dplyr::select_if(is.numeric) 
predictors <- colnames(nombres)
# Bind the logit and tidying the data for plot
mydata2 <- mydata2 %>%
  mutate(logit = log(probabilities2/(1-probabilities2))) %>%
  gather(key = "predictors", value = "predictor.value", -logit)

#2)
ggplot(mydata2, aes(predictor.value, logit))+
  geom_point(size = 0.5, alpha = 0.5) +
  geom_smooth(method = "loess") + 
  theme_bw() + 
  facet_wrap(~predictors, scales = "free_x")

Al realizar trasnformaciones logaritmicas, se ve que se respeta la linealidad de los logits, excepto en las siguientes variables: Globulos blancos, frecuencia cardíaca, frecuencia respiratoria y clearence de creatinina. Frecuencia respiratoria no se pudo transformar por la presencia de un valor = “0”, que correspondiente a un paciente en paro cardiorrespiratorio.

c) Multicolinealidad y valores influyentes

#valores influentes
plot(m_logits2, which = 4, id.n = 3)

model.data <- augment(m_logits2) %>% dplyr::mutate(index = 1:n())
model.data %>% top_n(3, .cooksd)
ggplot(model.data, aes(index, .std.resid)) + 
  geom_point(aes(color = m_logits2$Compl_Sang_Todos), alpha = .5) +
  theme_bw()

model.data %>% 
  filter(abs(.std.resid) > 3)

#hay un solo valor influyente

#multicolinealidad
car::vif(m_logits2) #Se evidencia multicolinealidad en las variables transformadas y en los scores, por lo cuál los sacamos y volvemos a evaluar.
                                           GVIF Df GVIF^(1/(2*Df))
Pac_Sex                                    2.00  1            1.41
Pac_Edad                                   4.98  1            2.23
Pac_Cobertura                              3.36  3            1.22
Pac_HTA                                    1.70  1            1.30
Pac_DBT                                    1.59  1            1.26
Pac_TBQ                                    2.51  2            1.26
Pac_DLP                                    1.72  1            1.31
Pac_ICC                                    1.84  1            1.36
Pac_FA                                     1.81  1            1.34
Pac_ETVpre                                 1.51  1            1.23
Pac_TEP_previo_menor_3_meses               1.00  1            1.00
Pac_Deamb                                  1.52  1            1.23
Pac_Reposo                                 1.54  1            1.24
Pac_EPOC                                   1.69  1            1.30
Pac_ACVglobal                              1.76  1            1.33
Pac_Hemorragia_Previa_Mayor_Todas    1729063.37  1         1314.94
Pac_Hemorragia_Previa_Mayor_Reciente 1729063.45  1         1314.94
Pac_EnfAuto                                1.34  1            1.16
Pac_IRCglobal                              1.44  1            1.20
Pac_SmeProcoag                             1.00  1            1.00
PESI_Cancer                                1.54  1            1.24
Pac_ACO_Previa                             1.78  1            1.33
IMC                                        1.73  1            1.31
MotInt                                     7.30  5            1.22
PESI_Det_Sens                              1.43  1            1.20
PESI_Taquicardia                           3.73  1            1.93
PESI_Hipotension                           4.38  1            2.09
CC_FR_Ingreso                              4.02  1            2.01
PESI_Taquipnea                             3.82  1            1.95
PESI_Hipotermia                            1.57  1            1.25
CC_SaO90                                   3.24  1            1.80
Wells                                      1.51  1            1.23
PESIcalc                                   1.59  1            1.26
Pac_Cx_Total                               1.53  1            1.24
Lab_Hb                                     1.78  1            1.33
Lab_Cr                                     8.16  1            2.86
Biomarc_pos                                6.04  1            2.46
ECOTT_FSVI                                 6.57  4            1.27
ECOTT_TAPSE                                3.04  1            1.74
ECOTT_PSAP                                 2.17  1            1.47
ECOTT_DisfVD                               3.90  1            1.98
Alta_Carga_Trombo_TAC                      1.47  1            1.21
Int_O_Alto_Riesgo_Calc                     7.62  1            2.76
EstRiesgo                                 10.02  3            1.47
ServicioCargo                              2.04  1            1.43
RIETE_Calc                                 1.77  1            1.33
HASBLED                                    1.64  1            1.28
ACOint                                     1.24  1            1.11
FVCI                                       1.27  1            1.13
Tto_Reperf                                15.75  1            3.97
TL_cual                                   48.05  3            1.91
Compl_SoporteHD_NO                         2.57  1            1.60
TiempoInt                                  1.70  1            1.30
Alta_Tto_TiposACO                          8.91  4            1.31
Pac_Edad_Corte                             2.83  1            1.68
Lab_Plaq_Corte                             3.71  1            1.93
Log_FC                                     3.99  1            2.00
Log_TAS                                    3.84  1            1.96
Log_ClCr                                  12.55  1            3.54
Log_CC_SaO_Ingreso                         3.46  1            1.86
Log_Lab_Plaq                               3.41  1            1.85
Log_Lab_GB                                 1.77  1            1.33
Log_Peso                                   3.27  1            1.81
Dias_Sx_Admision                           1.48  1            1.22
base_vif <- base_imp[,!names(base_imp) %in% c("TEP_motivo_int", "miss.univ","DOAC_si_vs_no", "Pac_Cobertura", "Pac_Hemorragia_Previa_Mayor_Reciente", "PESIcalc", "Lab_Cr", "Int_O_Alto_Riesgo_Calc", "RIETE_Calc", "TL_cual", "Lab_Plaq_Corte", "PESI_Taquicardia", "PESI_Taquipnea", "PESI_Hipotension", "CC_SaO90", "EstRiesgo", "MotInt")]
m_vif <- glm (Compl_Sang_Todos ~. , data = base_vif, family = binomial (link = logit))
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
car::vif(m_vif)
                                  GVIF Df GVIF^(1/(2*Df))
Pac_Sex                           1.53  1            1.24
Pac_Edad                          2.86  1            1.69
Pac_HTA                           1.48  1            1.22
Pac_DBT                           1.33  1            1.15
Pac_TBQ                           1.85  2            1.17
Pac_DLP                           1.39  1            1.18
Pac_ICC                           1.37  1            1.17
Pac_FA                            1.50  1            1.23
Pac_ETVpre                        1.39  1            1.18
Pac_TEP_previo_menor_3_meses      1.00  1            1.00
Pac_Deamb                         1.29  1            1.14
Pac_Reposo                        1.17  1            1.08
Pac_EPOC                          1.45  1            1.20
Pac_ACVglobal                     1.45  1            1.20
Pac_Hemorragia_Previa_Mayor_Todas 1.26  1            1.12
Pac_EnfAuto                       1.19  1            1.09
Pac_IRCglobal                     1.24  1            1.11
Pac_SmeProcoag                    1.00  1            1.00
PESI_Cancer                       1.33  1            1.15
Pac_ACO_Previa                    1.53  1            1.24
Peso                              1.55  1            1.25
IMC                               1.40  1            1.18
PESI_Det_Sens                     1.25  1            1.12
CC_Horas_Sx_Admision              1.21  1            1.10
CC_FC_Ingreso                     1.53  1            1.24
CC_TAS_Ingreso                    1.50  1            1.22
CC_FR_Ingreso                     1.61  1            1.27
PESI_Hipotermia                   1.23  1            1.11
CC_SaO_Ingreso                    1.55  1            1.25
Wells                             1.18  1            1.09
Pac_Cx_Total                      1.32  1            1.15
Lab_Hb                            1.36  1            1.17
Lab_GB                            1.22  1            1.10
Lab_Plaq                          1.33  1            1.15
Biomarc_pos                       1.52  1            1.23
ECOTT_FSVI                        2.85  4            1.14
ECOTT_TAPSE                       2.62  1            1.62
ECOTT_PSAP                        1.74  1            1.32
ECOTT_DisfVD                      2.93  1            1.71
Alta_Carga_Trombo_TAC             1.30  1            1.14
ServicioCargo                     1.49  1            1.22
HASBLED                           1.17  1            1.08
ACOint                            1.19  1            1.09
FVCI                              1.18  1            1.08
Tto_Reperf                        1.77  1            1.33
Compl_SoporteHD_NO                1.93  1            1.39
TiempoInt                         1.24  1            1.11
Alta_Tto_TiposACO                 3.70  4            1.18
ClCr                              2.03  1            1.42
Pac_Edad_Corte                    2.17  1            1.47

. Se evidencia colinealidad significativa en algunas variables que son las que se utilizan para formular scores (PESI, RIETE) y también para ClCr. Al sacar estas variables transformadas y scores no vemos colinealidad significativa, excepto para las variables “Alta_Tto_Tipos_ACO” (Tipo de ACO al alta), “MotInt” (Motivo de internación) y EstRiesgo (Estratificación de riesgo por ESC). Lo tendremos en cuenta a la hora de seleccionar variables para los modelos de regresión.

. Solamente evidenciamos 1 valor influyente.

d) Analisis de sensibilidad para las variables que no cumplen criterio de linealidad de logits

. Evaluaremos si separando a los pacientes en cuartiles o terciles podemos obtener rendimiento de las variables FR, FC, TAS, globulos blancos y clearence de creatinina. Además exploraremos las variables plaquetas y la variable edad, que no tienen pendiente en la curva de logits (lo cuál explica que no sean significativas en un modelo univariado) para ver si hay algún subgrupo donde se evidencie relación con la variable respuesta.

a) Edad

base_sens <- base_logit2
base_sens$Compl_Sang_Todos <- as.factor(base_sens$Compl_Sang_Todos)
summary(base_sens$Pac_Edad)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   16.0    53.0    67.0    63.8    76.0    97.0 
base_sens$Pac_Edad_Corte<-cut(base_sens$Pac_Edad,breaks=seq(16,97,length.out=5))
table(base_sens$Pac_Edad_Corte)

  (16,36.2] (36.2,56.5] (56.5,76.8]   (76.8,97] 
         54         147         318         163 
clases_edad <- cut(base_sens$Pac_Edad,breaks=seq(16,97,length.out=10))
table(clases_edad)
clases_edad
(16,25] (25,34] (34,43] (43,52] (52,61] (61,70] (70,79] (79,88] (88,97] 
     16      30      52      67      84     159     153      98      23 
medias_edad<-tapply(base_sens$Pac_Edad,INDEX=clases_edad,FUN=mean) 

base_sens$Compl_Sang_Todos <- as.integer(base_sens$Compl_Sang_Todos)
sumaYporClases_edad<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_edad,FUN=sum)
sumaYporClases_edad
(16,25] (25,34] (34,43] (43,52] (52,61] (61,70] (70,79] (79,88] (88,97] 
     18      32      55      74      94     172     167     102      24 
pEstimado_edad<-as.vector(sumaYporClases_edad/table(clases_edad))
pEstimado_edad <- pEstimado_edad -1

logit_edad<-log(pEstimado_edad/(1-(pEstimado_edad)))
str(logit_edad)
 num [1:9] -1.95 -2.64 -2.79 -2.15 -2 ...
plot(medias_edad,logit_edad,xlab="Media de Edad por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: Edad con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en terciles y hago graficos

base_sens$Pac_Edad_Terc <- ntile(base_sens$Pac_Edad, 3) 
clases_edad_terc<-base_sens$Pac_Edad_Terc
table(clases_edad_terc) 
clases_edad_terc
  1   2   3 
228 228 228 
medias_edad_terc<-tapply(base_sens$Pac_Edad,INDEX=clases_edad_terc,FUN=mean) 

sumaYporClases_edad_terc<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_edad_terc,FUN=sum)
sumaYporClases_edad_terc
  1   2   3 
252 246 243 
pEstimado_edad_terc<-as.vector(sumaYporClases_edad_terc/table(clases_edad_terc))
pEstimado_edad_terc <- pEstimado_edad_terc -1

logit_edad_terc<-log(pEstimado_edad_terc/(1-(pEstimado_edad_terc)))

plot(medias_edad_terc,logit_edad_terc,xlab="Media de Edad por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: Edad terciles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en cuartiles y hago graficos 
base_sens$Pac_Edad_Cuart <- ntile(base_sens$Pac_Edad, 4) 
clases_edad_Cuart<-base_sens$Pac_Edad_Cuart
table(clases_edad_Cuart) 
clases_edad_Cuart
  1   2   3   4 
171 171 171 171 
medias_edad_Cuart<-tapply(base_sens$Pac_Edad,INDEX=clases_edad_Cuart,FUN=mean) 

sumaYporClases_edad_Cuart<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_edad_Cuart,FUN=sum)
sumaYporClases_edad_Cuart
  1   2   3   4 
187 188 183 183 
pEstimado_edad_Cuart<-as.vector(sumaYporClases_edad_Cuart/table(clases_edad_Cuart))
pEstimado_edad_Cuart <- pEstimado_edad_Cuart -1

logit_edad_Cuart<-log(pEstimado_edad_Cuart/(1-(pEstimado_edad_Cuart)))

plot(medias_edad_Cuart,logit_edad_Cuart,xlab="Media de Edad por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: Edad cuartiles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en quintiles y hago graficos 
base_sens$Pac_Edad_Quint <- ntile(base_sens$Pac_Edad, 5) 
clases_edad_Quint<-base_sens$Pac_Edad_Quint
table(clases_edad_Quint) 
clases_edad_Quint
  1   2   3   4   5 
137 137 137 137 136 
medias_edad_Quint<-tapply(base_sens$Pac_Edad,INDEX=clases_edad_Quint,FUN=mean) 

sumaYporClases_edad_Quint<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_edad_Quint,FUN=sum)
sumaYporClases_edad_Quint
  1   2   3   4   5 
149 152 148 146 146 
pEstimado_edad_Quint<-as.vector(sumaYporClases_edad_Quint/table(clases_edad_Quint))
pEstimado_edad_Quint <- pEstimado_edad_Quint -1

logit_edad_Quint<-log(pEstimado_edad_Quint/(1-(pEstimado_edad_Quint)))

plot(medias_edad_Quint,logit_edad_Quint,xlab="Media de Edad por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: Edad quintiles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en dos y hago graficos 
base_sens$Pac_Edad_Binom <- ntile(base_sens$Pac_Edad, 2) 
clases_edad_Binom<-base_sens$Pac_Edad_Binom
table(clases_edad_Binom) 
clases_edad_Binom
  1   2 
342 342 
medias_edad_Binom<-tapply(base_sens$Pac_Edad,INDEX=clases_edad_Binom,FUN=mean) 

sumaYporClases_edad_Binom<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_edad_Binom,FUN=sum)
sumaYporClases_edad_Binom
  1   2 
375 366 
pEstimado_edad_Binom<-as.vector(sumaYporClases_edad_Binom/table(clases_edad_Binom))
pEstimado_edad_Binom <- pEstimado_edad_Binom -1

logit_edad_Binom<-log(pEstimado_edad_Binom/(1-(pEstimado_edad_Binom)))

plot(medias_edad_Binom,logit_edad_Binom,xlab="Media de Edad por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: Edad dos grupos con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")

b) FR

base_sens$Compl_Sang_Todos <- as.factor(base_sens$Compl_Sang_Todos)
summary(base_sens$CC_FR_Ingreso)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    0.0    18.0    20.0    21.8    25.0    43.0 
base_sens$CC_FR_Ingreso_Corte<-cut(base_sens$CC_FR_Ingreso,breaks=seq(0,43,length.out=5))
table(base_sens$CC_FR_Ingreso_Corte)

   (0,10.8] (10.8,21.5] (21.5,32.2]   (32.2,43] 
          3         368         287          25 
clases_fr <- cut(base_sens$CC_FR_Ingreso,breaks=seq(0,43,length.out=10))
table(clases_fr)
clases_fr
   (0,4.78] (4.78,9.56] (9.56,14.3] (14.3,19.1] (19.1,23.9] (23.9,28.7] (28.7,33.4] (33.4,38.2]   (38.2,43] 
          0           2          26         213         195         177          50          12           8 
medias_fr<-tapply(base_sens$CC_FR_Ingreso,INDEX=clases_fr,FUN=mean) 

base_sens$Compl_Sang_Todos <- as.integer(base_sens$Compl_Sang_Todos)
sumaYporClases_fr<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_fr,FUN=sum)
sumaYporClases_fr
   (0,4.78] (4.78,9.56] (9.56,14.3] (14.3,19.1] (19.1,23.9] (23.9,28.7] (28.7,33.4] (33.4,38.2]   (38.2,43] 
         NA           3          28         227         206         201          53          13           9 
pEstimado_fr<-as.vector(sumaYporClases_fr/table(clases_fr))
pEstimado_fr <- pEstimado_fr -1

logit_fr<-log(pEstimado_fr/(1-(pEstimado_fr)))

plot(medias_fr,logit_fr,xlab="Media de FR por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: FR con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en terciles y hago graficos

base_sens$CC_FR_Ingreso_Terc <- ntile(base_sens$CC_FR_Ingreso, 3) 
clases_fr_terc<-base_sens$CC_FR_Ingreso_Terc
table(clases_fr_terc) 
clases_fr_terc
  1   2   3 
228 228 228 
medias_fr_terc<-tapply(base_sens$CC_FR_Ingreso,INDEX=clases_fr_terc,FUN=mean) 

sumaYporClases_fr_terc<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_fr_terc,FUN=sum)
sumaYporClases_fr_terc
  1   2   3 
244 244 253 
pEstimado_fr_terc<-as.vector(sumaYporClases_fr_terc/table(clases_fr_terc))
pEstimado_fr_terc <- pEstimado_fr_terc -1

logit_fr_terc<-log(pEstimado_fr_terc/(1-(pEstimado_fr_terc)))

plot(medias_fr_terc,logit_fr_terc,xlab="Media de FR por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: FR terciles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en cuartiles y hago graficos 
base_sens$CC_FR_Ingreso_Cuart <- ntile(base_sens$CC_FR_Ingreso, 4) 
clases_fr_Cuart<-base_sens$CC_FR_Ingreso_Cuart
table(clases_fr_Cuart) 
clases_fr_Cuart
  1   2   3   4 
171 171 171 171 
medias_fr_Cuart<-tapply(base_sens$CC_FR_Ingreso,INDEX=clases_fr_Cuart,FUN=mean) 

sumaYporClases_fr_Cuart<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_fr_Cuart,FUN=sum)
sumaYporClases_fr_Cuart
  1   2   3   4 
181 183 191 186 
pEstimado_fr_Cuart<-as.vector(sumaYporClases_fr_Cuart/table(clases_fr_Cuart))
pEstimado_fr_Cuart <- pEstimado_fr_Cuart -1

logit_fr_Cuart<-log(pEstimado_fr_Cuart/(1-(pEstimado_fr_Cuart)))

plot(medias_fr_Cuart,logit_fr_Cuart,xlab="Media de FR por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: FR cuartiles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en quintiles y hago graficos 
base_sens$CC_FR_Ingreso_Quint <- ntile(base_sens$CC_FR_Ingreso, 5) 
clases_fr_Quint<-base_sens$CC_FR_Ingreso_Quint
table(clases_fr_Quint) 
clases_fr_Quint
  1   2   3   4   5 
137 137 137 137 136 
medias_fr_Quint<-tapply(base_sens$CC_FR_Ingreso,INDEX=clases_fr_Quint,FUN=mean) 

sumaYporClases_fr_Quint<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_fr_Quint,FUN=sum)
sumaYporClases_fr_Quint
  1   2   3   4   5 
146 146 144 158 147 
pEstimado_fr_Quint<-as.vector(sumaYporClases_fr_Quint/table(clases_fr_Quint))
pEstimado_fr_Quint <- pEstimado_fr_Quint -1

logit_fr_Quint<-log(pEstimado_fr_Quint/(1-(pEstimado_fr_Quint)))

plot(medias_fr_Quint,logit_fr_Quint,xlab="Media de FR por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: FR quintiles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en dos y hago graficos 
summary(base_sens$CC_FR_Ingreso)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    0.0    18.0    20.0    21.8    25.0    43.0 
base_sens$CC_FR_Ingreso_Binom <- ntile(base_sens$CC_FR_Ingreso, 2) 
clases_fr_Binom<-base_sens$CC_FR_Ingreso_Binom
table(clases_fr_Binom) 
clases_fr_Binom
  1   2 
342 342 
medias_fr_Binom<-tapply(base_sens$CC_FR_Ingreso,INDEX=clases_fr_Binom,FUN=mean) 

sumaYporClases_fr_Binom<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_fr_Binom,FUN=sum)
sumaYporClases_fr_Binom
  1   2 
364 377 
pEstimado_fr_Binom<-as.vector(sumaYporClases_fr_Binom/table(clases_fr_Binom))
pEstimado_fr_Binom <- pEstimado_fr_Binom -1

logit_fr_Binom<-log(pEstimado_fr_Binom/(1-(pEstimado_fr_Binom)))

plot(medias_fr_Binom,logit_fr_Binom,xlab="Media de FR por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: FR dos grupos con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")

c) FC

base_sens$Compl_Sang_Todos <- as.factor(base_sens$Compl_Sang_Todos)
summary(base_sens$Log_FC)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   3.40    4.38    4.58    4.54    4.70    5.19 
base_sens$Log_FC_Corte<-cut(base_sens$Log_FC,breaks=seq(3.4,5.19,length.out=5))
table(base_sens$Log_FC_Corte)

 (3.4,3.85] (3.85,4.29] (4.29,4.74] (4.74,5.19] 
          3          99         451         128 
clases_FC <- cut(base_sens$Log_FC,breaks=seq(3.4,5.19,length.out=10))
table(clases_FC)
clases_FC
  (3.4,3.6]   (3.6,3.8]     (3.8,4]     (4,4.2]  (4.2,4.39] (4.39,4.59] (4.59,4.79] (4.79,4.99] (4.99,5.19] 
          2           1           6          45         152         144         264          54          13 
medias_FC<-tapply(base_sens$Log_FC,INDEX=clases_FC,FUN=mean) 

base_sens$Compl_Sang_Todos <- as.integer(base_sens$Compl_Sang_Todos)
sumaYporClases_FC<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_FC,FUN=sum)
sumaYporClases_FC
  (3.4,3.6]   (3.6,3.8]     (3.8,4]     (4,4.2]  (4.2,4.39] (4.39,4.59] (4.59,4.79] (4.79,4.99] (4.99,5.19] 
          3           1           7          47         160         153         288          64          15 
pEstimado_FC<-as.vector(sumaYporClases_FC/table(clases_FC))
pEstimado_FC <- pEstimado_FC -1

logit_FC<-log(pEstimado_FC/(1-(pEstimado_FC)))

plot(medias_FC,logit_FC,xlab="Media de FC por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: FC con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en terciles y hago graficos

base_sens$Log_FC_Terc <- ntile(base_sens$Log_FC, 3) 
clases_FC_terc<-base_sens$Log_FC_Terc
table(clases_FC_terc) 
clases_FC_terc
  1   2   3 
228 228 228 
medias_FC_terc<-tapply(base_sens$Log_FC,INDEX=clases_FC_terc,FUN=mean) 

sumaYporClases_FC_terc<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_FC_terc,FUN=sum)
sumaYporClases_FC_terc
  1   2   3 
240 245 256 
pEstimado_FC_terc<-as.vector(sumaYporClases_FC_terc/table(clases_FC_terc))
pEstimado_FC_terc <- pEstimado_FC_terc -1

logit_FC_terc<-log(pEstimado_FC_terc/(1-(pEstimado_FC_terc)))

plot(medias_FC_terc,logit_FC_terc,xlab="Media de FC por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: FC terciles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en cuartiles y hago graficos 
base_sens$Log_FC_Cuart <- ntile(base_sens$Log_FC, 4) 
clases_FC_Cuart<-base_sens$Log_FC_Cuart
table(clases_FC_Cuart) 
clases_FC_Cuart
  1   2   3   4 
171 171 171 171 
medias_FC_Cuart<-tapply(base_sens$Log_FC,INDEX=clases_FC_Cuart,FUN=mean) 

sumaYporClases_FC_Cuart<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_FC_Cuart,FUN=sum)
sumaYporClases_FC_Cuart
  1   2   3   4 
182 179 188 192 
pEstimado_FC_Cuart<-as.vector(sumaYporClases_FC_Cuart/table(clases_FC_Cuart))
pEstimado_FC_Cuart <- pEstimado_FC_Cuart -1

logit_FC_Cuart<-log(pEstimado_FC_Cuart/(1-(pEstimado_FC_Cuart)))

plot(medias_FC_Cuart,logit_FC_Cuart,xlab="Media de FC por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: FC cuartiles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en quintiles y hago graficos 
base_sens$Log_FC_Quint <- ntile(base_sens$Log_FC, 5) 
clases_FC_Quint<-base_sens$Log_FC_Quint
table(clases_FC_Quint) 
clases_FC_Quint
  1   2   3   4   5 
137 137 137 137 136 
medias_FC_Quint<-tapply(base_sens$Log_FC,INDEX=clases_FC_Quint,FUN=mean) 

sumaYporClases_FC_Quint<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_FC_Quint,FUN=sum)
sumaYporClases_FC_Quint
  1   2   3   4   5 
145 143 148 151 154 
pEstimado_FC_Quint<-as.vector(sumaYporClases_FC_Quint/table(clases_FC_Quint))
pEstimado_FC_Quint <- pEstimado_FC_Quint -1

logit_FC_Quint<-log(pEstimado_FC_Quint/(1-(pEstimado_FC_Quint)))

plot(medias_FC_Quint,logit_FC_Quint,xlab="Media de FC por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: FC quintiles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en dos y hago graficos 
base_sens$Log_FC_Binom <- ntile(base_sens$Log_FC, 2) 
clases_FC_Binom<-base_sens$Log_FC_Binom
table(clases_FC_Binom) 
clases_FC_Binom
  1   2 
342 342 
medias_FC_Binom<-tapply(base_sens$Log_FC,INDEX=clases_FC_Binom,FUN=mean) 

sumaYporClases_FC_Binom<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_FC_Binom,FUN=sum)
sumaYporClases_FC_Binom
  1   2 
361 380 
pEstimado_FC_Binom<-as.vector(sumaYporClases_FC_Binom/table(clases_FC_Binom))
pEstimado_FC_Binom <- pEstimado_FC_Binom -1

logit_FC_Binom<-log(pEstimado_FC_Binom/(1-(pEstimado_FC_Binom)))

plot(medias_FC_Binom,logit_FC_Binom,xlab="Media de FC por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: FC dos grupos con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")

d) TAS

base_sens$Compl_Sang_Todos <- as.factor(base_sens$Compl_Sang_Todos)
summary(base_sens$Log_TAS)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   3.91    4.70    4.79    4.79    4.93    5.39 
base_sens$Log_TAS_Corte<-cut(base_sens$Log_TAS,breaks=seq(3.91,5.39,length.out=5))
table(base_sens$Log_TAS_Corte)

(3.91,4.28] (4.28,4.65] (4.65,5.02] (5.02,5.39] 
         15         121         495          52 
clases_TAS <- cut(base_sens$Log_TAS,breaks=seq(3.91,5.39,length.out=10))
table(clases_TAS)
clases_TAS
(3.91,4.07] (4.07,4.24]  (4.24,4.4]  (4.4,4.57] (4.57,4.73]  (4.73,4.9]  (4.9,5.06] (5.06,5.23] (5.23,5.39] 
          1           5          32          37         149         270         146          39           4 
medias_TAS<-tapply(base_sens$Log_TAS,INDEX=clases_TAS,FUN=mean) 

base_sens$Compl_Sang_Todos <- as.integer(base_sens$Compl_Sang_Todos)
sumaYporClases_TAS<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_TAS,FUN=sum)
sumaYporClases_TAS
(3.91,4.07] (4.07,4.24]  (4.24,4.4]  (4.4,4.57] (4.57,4.73]  (4.73,4.9]  (4.9,5.06] (5.06,5.23] (5.23,5.39] 
          1           8          35          44         160         291         158          39           4 
pEstimado_TAS<-as.vector(sumaYporClases_TAS/table(clases_TAS))
pEstimado_TAS <- pEstimado_TAS -1

logit_TAS<-log(pEstimado_TAS/(1-(pEstimado_TAS)))

plot(medias_TAS,logit_TAS,xlab="Media de TAS por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: TAS con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en terciles y hago graficos

base_sens$Log_TAS_Terc <- ntile(base_sens$Log_TAS, 3) 
clases_TAS_terc<-base_sens$Log_TAS_Terc
table(clases_TAS_terc) 
clases_TAS_terc
  1   2   3 
228 228 228 
medias_TAS_terc<-tapply(base_sens$Log_TAS,INDEX=clases_TAS_terc,FUN=mean) 

sumaYporClases_TAS_terc<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_TAS_terc,FUN=sum)
sumaYporClases_TAS_terc
  1   2   3 
252 246 243 
pEstimado_TAS_terc<-as.vector(sumaYporClases_TAS_terc/table(clases_TAS_terc))
pEstimado_TAS_terc <- pEstimado_TAS_terc -1

logit_TAS_terc<-log(pEstimado_TAS_terc/(1-(pEstimado_TAS_terc)))

plot(medias_TAS_terc,logit_TAS_terc,xlab="Media de TAS por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: TAS terciles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en cuartiles y hago graficos 
base_sens$Log_TAS_Cuart <- ntile(base_sens$Log_TAS, 4) 
clases_TAS_Cuart<-base_sens$Log_TAS_Cuart
table(clases_TAS_Cuart) 
clases_TAS_Cuart
  1   2   3   4 
171 171 171 171 
medias_TAS_Cuart<-tapply(base_sens$Log_TAS,INDEX=clases_TAS_Cuart,FUN=mean) 

sumaYporClases_TAS_Cuart<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_TAS_Cuart,FUN=sum)
sumaYporClases_TAS_Cuart
  1   2   3   4 
192 181 186 182 
pEstimado_TAS_Cuart<-as.vector(sumaYporClases_TAS_Cuart/table(clases_TAS_Cuart))
pEstimado_TAS_Cuart <- pEstimado_TAS_Cuart -1

logit_TAS_Cuart<-log(pEstimado_TAS_Cuart/(1-(pEstimado_TAS_Cuart)))

plot(medias_TAS_Cuart,logit_TAS_Cuart,xlab="Media de TAS por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: TAS cuartiles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en quintiles y hago graficos 
base_sens$Log_TAS_Quint <- ntile(base_sens$Log_TAS, 5) 
clases_TAS_Quint<-base_sens$Log_TAS_Quint
table(clases_TAS_Quint) 
clases_TAS_Quint
  1   2   3   4   5 
137 137 137 137 136 
medias_TAS_Quint<-tapply(base_sens$Log_TAS,INDEX=clases_TAS_Quint,FUN=mean) 

sumaYporClases_TAS_Quint<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_TAS_Quint,FUN=sum)
sumaYporClases_TAS_Quint
  1   2   3   4   5 
156 144 147 150 144 
pEstimado_TAS_Quint<-as.vector(sumaYporClases_TAS_Quint/table(clases_TAS_Quint))
pEstimado_TAS_Quint <- pEstimado_TAS_Quint -1

logit_TAS_Quint<-log(pEstimado_TAS_Quint/(1-(pEstimado_TAS_Quint)))

plot(medias_TAS_Quint,logit_TAS_Quint,xlab="Media de TAS por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: TAS quintiles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en dos y hago graficos 
base_sens$Log_TAS_Binom <- ntile(base_sens$Log_TAS, 2) 
clases_TAS_Binom<-base_sens$Log_TAS_Binom
table(clases_TAS_Binom) 
clases_TAS_Binom
  1   2 
342 342 
medias_TAS_Binom<-tapply(base_sens$Log_TAS,INDEX=clases_TAS_Binom,FUN=mean) 

sumaYporClases_TAS_Binom<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_TAS_Binom,FUN=sum)
sumaYporClases_TAS_Binom
  1   2 
373 368 
pEstimado_TAS_Binom<-as.vector(sumaYporClases_TAS_Binom/table(clases_TAS_Binom))
pEstimado_TAS_Binom <- pEstimado_TAS_Binom -1

logit_TAS_Binom<-log(pEstimado_TAS_Binom/(1-(pEstimado_TAS_Binom)))

plot(medias_TAS_Binom,logit_TAS_Binom,xlab="Media de TAS por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: Cr dos grupos con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")

e) Plaquetas

base_sens$Compl_Sang_Todos <- as.factor(base_sens$Compl_Sang_Todos)
summary(base_sens$Log_Lab_Plaq)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   9.78   11.98   12.23   12.22   12.51   13.50 
base_sens$Log_Lab_Plaq_Corte<-cut(base_sens$Log_Lab_Plaq,breaks=seq(15.42,57.33,length.out=5))
table(base_sens$Log_Lab_Plaq_Corte)

(15.4,25.9] (25.9,36.4] (36.4,46.9] (46.9,57.3] 
          0           0           0           0 
clases_Log_Lab_Plaq <- cut(base_sens$Log_Lab_Plaq,breaks=seq(15.42,57.33,length.out=10))
table(clases_Log_Lab_Plaq)
clases_Log_Lab_Plaq
(15.4,20.1] (20.1,24.7] (24.7,29.4]   (29.4,34]   (34,38.7] (38.7,43.4]   (43.4,48]   (48,52.7] (52.7,57.3] 
          0           0           0           0           0           0           0           0           0 
medias_Log_Lab_Plaq<-tapply(base_sens$Log_Lab_Plaq,INDEX=clases_Log_Lab_Plaq,FUN=mean) 

base_sens$Compl_Sang_Todos <- as.integer(base_sens$Compl_Sang_Todos)
sumaYporClases_Log_Lab_Plaq<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_Log_Lab_Plaq,FUN=sum)
sumaYporClases_Log_Lab_Plaq
(15.4,20.1] (20.1,24.7] (24.7,29.4]   (29.4,34]   (34,38.7] (38.7,43.4]   (43.4,48]   (48,52.7] (52.7,57.3] 
         NA          NA          NA          NA          NA          NA          NA          NA          NA 
pEstimado_Log_Lab_Plaq<-as.vector(sumaYporClases_Log_Lab_Plaq/table(clases_Log_Lab_Plaq))
pEstimado_Log_Lab_Plaq <- pEstimado_Log_Lab_Plaq -1

logit_Log_Lab_Plaq<-log(pEstimado_Log_Lab_Plaq/(1-(pEstimado_Log_Lab_Plaq)))

# Separo en terciles y hago graficos

base_sens$Log_Lab_Plaq_Terc <- ntile(base_sens$Log_Lab_Plaq, 3) 
clases_Log_Lab_Plaq_terc<-base_sens$Log_Lab_Plaq_Terc
table(clases_Log_Lab_Plaq_terc) 
clases_Log_Lab_Plaq_terc
  1   2   3 
228 228 228 
medias_Log_Lab_Plaq_terc<-tapply(base_sens$Log_Lab_Plaq,INDEX=clases_Log_Lab_Plaq_terc,FUN=mean) 

sumaYporClases_Log_Lab_Plaq_terc<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_Log_Lab_Plaq_terc,FUN=sum)
sumaYporClases_Log_Lab_Plaq_terc
  1   2   3 
245 246 250 
pEstimado_Log_Lab_Plaq_terc<-as.vector(sumaYporClases_Log_Lab_Plaq_terc/table(clases_Log_Lab_Plaq_terc))
pEstimado_Log_Lab_Plaq_terc <- pEstimado_Log_Lab_Plaq_terc -1

logit_Log_Lab_Plaq_terc<-log(pEstimado_Log_Lab_Plaq_terc/(1-(pEstimado_Log_Lab_Plaq_terc)))

plot(medias_Log_Lab_Plaq_terc,logit_Log_Lab_Plaq_terc,xlab="Media de Plaquetas por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: Plaquetas terciles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en cuartiles y hago graficos 
base_sens$Log_Lab_Plaq_Cuart <- ntile(base_sens$Log_Lab_Plaq, 4) 
clases_Log_Lab_Plaq_Cuart<-base_sens$Log_Lab_Plaq_Cuart
table(clases_Log_Lab_Plaq_Cuart) 
clases_Log_Lab_Plaq_Cuart
  1   2   3   4 
171 171 171 171 
medias_Log_Lab_Plaq_Cuart<-tapply(base_sens$Log_Lab_Plaq,INDEX=clases_Log_Lab_Plaq_Cuart,FUN=mean) 

sumaYporClases_Log_Lab_Plaq_Cuart<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_Log_Lab_Plaq_Cuart,FUN=sum)
sumaYporClases_Log_Lab_Plaq_Cuart
  1   2   3   4 
185 184 186 186 
pEstimado_Log_Lab_Plaq_Cuart<-as.vector(sumaYporClases_Log_Lab_Plaq_Cuart/table(clases_Log_Lab_Plaq_Cuart))
pEstimado_Log_Lab_Plaq_Cuart <- pEstimado_Log_Lab_Plaq_Cuart -1

logit_Log_Lab_Plaq_Cuart<-log(pEstimado_Log_Lab_Plaq_Cuart/(1-(pEstimado_Log_Lab_Plaq_Cuart)))

plot(medias_Log_Lab_Plaq_Cuart,logit_Log_Lab_Plaq_Cuart,xlab="Media de Plaquetas por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: Plaquetas cuartiles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en quintiles y hago graficos 
base_sens$Log_Lab_Plaq_Quint <- ntile(base_sens$Log_Lab_Plaq, 5) 
clases_Log_Lab_Plaq_Quint<-base_sens$Log_Lab_Plaq_Quint
table(clases_Log_Lab_Plaq_Quint) 
clases_Log_Lab_Plaq_Quint
  1   2   3   4   5 
137 137 137 137 136 
medias_Log_Lab_Plaq_Quint<-tapply(base_sens$Log_Lab_Plaq,INDEX=clases_Log_Lab_Plaq_Quint,FUN=mean) 

sumaYporClases_Log_Lab_Plaq_Quint<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_Log_Lab_Plaq_Quint,FUN=sum)
sumaYporClases_Log_Lab_Plaq_Quint
  1   2   3   4   5 
150 145 149 150 147 
pEstimado_Log_Lab_Plaq_Quint<-as.vector(sumaYporClases_Log_Lab_Plaq_Quint/table(clases_Log_Lab_Plaq_Quint))
pEstimado_Log_Lab_Plaq_Quint <- pEstimado_Log_Lab_Plaq_Quint -1

logit_Log_Lab_Plaq_Quint<-log(pEstimado_Log_Lab_Plaq_Quint/(1-(pEstimado_Log_Lab_Plaq_Quint)))

plot(medias_Log_Lab_Plaq_Quint,logit_Log_Lab_Plaq_Quint,xlab="Media de Plaquetas por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: Plaquetas quintiles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en dos y hago graficos 
base_sens$Log_Lab_Plaq_Binom <- ntile(base_sens$Log_Lab_Plaq, 2) 
clases_Log_Lab_Plaq_Binom<-base_sens$Log_Lab_Plaq_Binom
table(clases_Log_Lab_Plaq_Binom) 
clases_Log_Lab_Plaq_Binom
  1   2 
342 342 
medias_Log_Lab_Plaq_Binom<-tapply(base_sens$Log_Lab_Plaq,INDEX=clases_Log_Lab_Plaq_Binom,FUN=mean) 

sumaYporClases_Log_Lab_Plaq_Binom<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_Log_Lab_Plaq_Binom,FUN=sum)
sumaYporClases_Log_Lab_Plaq_Binom
  1   2 
369 372 
pEstimado_Log_Lab_Plaq_Binom<-as.vector(sumaYporClases_Log_Lab_Plaq_Binom/table(clases_Log_Lab_Plaq_Binom))
pEstimado_Log_Lab_Plaq_Binom <- pEstimado_Log_Lab_Plaq_Binom -1

logit_Log_Lab_Plaq_Binom<-log(pEstimado_Log_Lab_Plaq_Binom/(1-(pEstimado_Log_Lab_Plaq_Binom)))

plot(medias_Log_Lab_Plaq_Binom,logit_Log_Lab_Plaq_Binom,xlab="Media de Plaquetas por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: Plaquetas dos grupos con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")

f) Globulos blancos (GB)

base_sens$Compl_Sang_Todos <- as.factor(base_sens$Compl_Sang_Todos)
summary(base_sens$Log_Lab_GB)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   7.03    8.94    9.22    9.20    9.47   11.59 
base_sens$Log_Lab_GB_Corte<-cut(base_sens$Log_Lab_GB,breaks=seq(7.03,11.59,length.out=5))
table(base_sens$Log_Lab_GB_Corte)

(7.03,8.17] (8.17,9.31] (9.31,10.4] (10.4,11.6] 
         13         386         278           6 
clases_GB <- cut(base_sens$Log_Lab_GB,breaks=seq(7.03,11.59,length.out=10))
table(clases_GB)
clases_GB
(7.03,7.54] (7.54,8.04] (8.04,8.55] (8.55,9.06] (9.06,9.56] (9.56,10.1] (10.1,10.6] (10.6,11.1] (11.1,11.6] 
          4           5          29         199         309         121          12           2           2 
medias_GB<-tapply(base_sens$Log_Lab_GB,INDEX=clases_GB,FUN=mean) 

base_sens$Compl_Sang_Todos <- as.integer(base_sens$Compl_Sang_Todos)
sumaYporClases_GB<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_GB,FUN=sum)
sumaYporClases_GB
(7.03,7.54] (7.54,8.04] (8.04,8.55] (8.55,9.06] (9.06,9.56] (9.56,10.1] (10.1,10.6] (10.6,11.1] (11.1,11.6] 
          4           6          32         207         336         136          14           3           2 
pEstimado_GB<-as.vector(sumaYporClases_GB/table(clases_GB))
pEstimado_GB <- pEstimado_GB -1

logit_GB<-log(pEstimado_GB/(1-(pEstimado_GB)))

plot(medias_GB,logit_GB,xlab="Media de GB por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: GB con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en terciles y hago graficos

base_sens$Log_Lab_GB_Terc <- ntile(base_sens$Log_Lab_GB, 3) 
clases_GB_terc<-base_sens$Log_Lab_GB_Terc
table(clases_GB_terc) 
clases_GB_terc
  1   2   3 
228 228 228 
medias_GB_terc<-tapply(base_sens$Log_Lab_GB,INDEX=clases_GB_terc,FUN=mean) 

sumaYporClases_GB_terc<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_GB_terc,FUN=sum)
sumaYporClases_GB_terc
  1   2   3 
240 246 255 
pEstimado_GB_terc<-as.vector(sumaYporClases_GB_terc/table(clases_GB_terc))
pEstimado_GB_terc <- pEstimado_GB_terc -1

logit_GB_terc<-log(pEstimado_GB_terc/(1-(pEstimado_GB_terc)))

plot(medias_GB_terc,logit_GB_terc,xlab="Media de GB por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: GB terciles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en cuartiles y hago graficos 
base_sens$Log_Lab_GB_Cuart <- ntile(base_sens$Log_Lab_GB, 4) 
clases_GB_Cuart<-base_sens$Log_Lab_GB_Cuart
table(clases_GB_Cuart) 
clases_GB_Cuart
  1   2   3   4 
171 171 171 171 
medias_GB_Cuart<-tapply(base_sens$Log_Lab_GB,INDEX=clases_GB_Cuart,FUN=mean) 

sumaYporClases_GB_Cuart<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_GB_Cuart,FUN=sum)
sumaYporClases_GB_Cuart
  1   2   3   4 
179 179 193 190 
pEstimado_GB_Cuart<-as.vector(sumaYporClases_GB_Cuart/table(clases_GB_Cuart))
pEstimado_GB_Cuart <- pEstimado_GB_Cuart -1

logit_GB_Cuart<-log(pEstimado_GB_Cuart/(1-(pEstimado_GB_Cuart)))

plot(medias_GB_Cuart,logit_GB_Cuart,xlab="Media de GB por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: GB cuartiles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en quintiles y hago graficos 
base_sens$Log_Lab_GB_Quint <- ntile(base_sens$Log_Lab_GB, 5) 
clases_GB_Quint<-base_sens$Log_Lab_GB_Quint
table(clases_GB_Quint) 
clases_GB_Quint
  1   2   3   4   5 
137 137 137 137 136 
medias_GB_Quint<-tapply(base_sens$Log_Lab_GB,INDEX=clases_GB_Quint,FUN=mean) 

sumaYporClases_GB_Quint<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_GB_Quint,FUN=sum)
sumaYporClases_GB_Quint
  1   2   3   4   5 
144 143 148 152 154 
pEstimado_GB_Quint<-as.vector(sumaYporClases_GB_Quint/table(clases_GB_Quint))
pEstimado_GB_Quint <- pEstimado_GB_Quint -1

logit_GB_Quint<-log(pEstimado_GB_Quint/(1-(pEstimado_GB_Quint)))

plot(medias_GB_Quint,logit_GB_Quint,xlab="Media de GB por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: GB quintiles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en dos y hago graficos 
base_sens$Log_Lab_GB_Binom <- ntile(base_sens$Log_Lab_GB, 2) 
clases_GB_Binom<-base_sens$Log_Lab_GB_Binom
table(clases_GB_Binom) 
clases_GB_Binom
  1   2 
342 342 
medias_GB_Binom<-tapply(base_sens$Log_Lab_GB,INDEX=clases_GB_Binom,FUN=mean) 

sumaYporClases_GB_Binom<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_GB_Binom,FUN=sum)
sumaYporClases_GB_Binom
  1   2 
358 383 
pEstimado_GB_Binom<-as.vector(sumaYporClases_GB_Binom/table(clases_GB_Binom))
pEstimado_GB_Binom <- pEstimado_GB_Binom -1

logit_GB_Binom<-log(pEstimado_GB_Binom/(1-(pEstimado_GB_Binom)))

plot(medias_GB_Binom,logit_GB_Binom,xlab="Media de GB por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: GB dos grupos con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")

g) Clearence de creatinina

base_sens$Compl_Sang_Todos <- as.factor(base_sens$Compl_Sang_Todos)
summary(base_sens$Log_ClCr)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   2.28    4.04    4.36    4.37    4.77    5.82 
base_sens$Log_ClCr_Corte<-cut(base_sens$Log_ClCr,breaks=seq(7.03,11.59,length.out=5))
table(base_sens$Log_ClCr_Corte)

(7.03,8.17] (8.17,9.31] (9.31,10.4] (10.4,11.6] 
          0           0           0           0 
clases_Log_ClCr <- cut(base_sens$Log_ClCr,breaks=seq(7.03,11.59,length.out=10))
table(clases_Log_ClCr)
clases_Log_ClCr
(7.03,7.54] (7.54,8.04] (8.04,8.55] (8.55,9.06] (9.06,9.56] (9.56,10.1] (10.1,10.6] (10.6,11.1] (11.1,11.6] 
          0           0           0           0           0           0           0           0           0 
medias_Log_ClCr<-tapply(base_sens$Log_ClCr,INDEX=clases_Log_ClCr,FUN=mean) 

base_sens$Compl_Sang_Todos <- as.integer(base_sens$Compl_Sang_Todos)
sumaYporClases_Log_ClCr<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_Log_ClCr,FUN=sum)
sumaYporClases_Log_ClCr
(7.03,7.54] (7.54,8.04] (8.04,8.55] (8.55,9.06] (9.06,9.56] (9.56,10.1] (10.1,10.6] (10.6,11.1] (11.1,11.6] 
         NA          NA          NA          NA          NA          NA          NA          NA          NA 
pEstimado_Log_ClCr<-as.vector(sumaYporClases_Log_ClCr/table(clases_Log_ClCr))
pEstimado_Log_ClCr <- pEstimado_Log_ClCr -1

logit_Log_ClCr<-log(pEstimado_Log_ClCr/(1-(pEstimado_Log_ClCr)))

# Separo en terciles y hago graficos

base_sens$Log_ClCr_Terc <- ntile(base_sens$Log_ClCr, 3) 
clases_Log_ClCr_terc<-base_sens$Log_ClCr_Terc
table(clases_Log_ClCr_terc) 
clases_Log_ClCr_terc
  1   2   3 
228 228 228 
medias_Log_ClCr_terc<-tapply(base_sens$Log_ClCr,INDEX=clases_Log_ClCr_terc,FUN=mean) 

sumaYporClases_Log_ClCr_terc<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_Log_ClCr_terc,FUN=sum)
sumaYporClases_Log_ClCr_terc
  1   2   3 
248 243 250 
pEstimado_Log_ClCr_terc<-as.vector(sumaYporClases_Log_ClCr_terc/table(clases_Log_ClCr_terc))
pEstimado_Log_ClCr_terc <- pEstimado_Log_ClCr_terc -1

logit_Log_ClCr_terc<-log(pEstimado_Log_ClCr_terc/(1-(pEstimado_Log_ClCr_terc)))

plot(medias_Log_ClCr_terc,logit_Log_ClCr_terc,xlab="Media de Log_ClCr por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: Log_ClCr terciles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en cuartiles y hago graficos 
base_sens$Log_ClCr_Cuart <- ntile(base_sens$Log_ClCr, 4) 
clases_Log_ClCr_Cuart<-base_sens$Log_ClCr_Cuart
table(clases_Log_ClCr_Cuart) 
clases_Log_ClCr_Cuart
  1   2   3   4 
171 171 171 171 
medias_Log_ClCr_Cuart<-tapply(base_sens$Log_ClCr,INDEX=clases_Log_ClCr_Cuart,FUN=mean) 

sumaYporClases_Log_ClCr_Cuart<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_Log_ClCr_Cuart,FUN=sum)
sumaYporClases_Log_ClCr_Cuart
  1   2   3   4 
187 180 185 189 
pEstimado_Log_ClCr_Cuart<-as.vector(sumaYporClases_Log_ClCr_Cuart/table(clases_Log_ClCr_Cuart))
pEstimado_Log_ClCr_Cuart <- pEstimado_Log_ClCr_Cuart -1

logit_Log_ClCr_Cuart<-log(pEstimado_Log_ClCr_Cuart/(1-(pEstimado_Log_ClCr_Cuart)))

plot(medias_Log_ClCr_Cuart,logit_Log_ClCr_Cuart,xlab="Media de Log_ClCr por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: Log_ClCr cuartiles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en quintiles y hago graficos 
base_sens$Log_ClCr_Quint <- ntile(base_sens$Log_ClCr, 5) 
clases_Log_ClCr_Quint<-base_sens$Log_ClCr_Quint
table(clases_Log_ClCr_Quint) 
clases_Log_ClCr_Quint
  1   2   3   4   5 
137 137 137 137 136 
medias_Log_ClCr_Quint<-tapply(base_sens$Log_ClCr,INDEX=clases_Log_ClCr_Quint,FUN=mean) 

sumaYporClases_Log_ClCr_Quint<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_Log_ClCr_Quint,FUN=sum)
sumaYporClases_Log_ClCr_Quint
  1   2   3   4   5 
152 144 145 149 151 
pEstimado_Log_ClCr_Quint<-as.vector(sumaYporClases_Log_ClCr_Quint/table(clases_Log_ClCr_Quint))
pEstimado_Log_ClCr_Quint <- pEstimado_Log_ClCr_Quint -1

logit_Log_ClCr_Quint<-log(pEstimado_Log_ClCr_Quint/(1-(pEstimado_Log_ClCr_Quint)))

plot(medias_Log_ClCr_Quint,logit_Log_ClCr_Quint,xlab="Media de Log_ClCr por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: Log_ClCr quintiles con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")


# Separo en dos y hago graficos 
base_sens$Log_ClCr_Binom <- ntile(base_sens$Log_ClCr, 2) 
clases_Log_ClCr_Binom<-base_sens$Log_ClCr_Binom
table(clases_Log_ClCr_Binom) 
clases_Log_ClCr_Binom
  1   2 
342 342 
medias_Log_ClCr_Binom<-tapply(base_sens$Log_ClCr,INDEX=clases_Log_ClCr_Binom,FUN=mean) 

sumaYporClases_Log_ClCr_Binom<-tapply(base_sens$Compl_Sang_Todos,INDEX=clases_Log_ClCr_Binom,FUN=sum)
sumaYporClases_Log_ClCr_Binom
  1   2 
367 374 
pEstimado_Log_ClCr_Binom<-as.vector(sumaYporClases_Log_ClCr_Binom/table(clases_Log_ClCr_Binom))
pEstimado_Log_ClCr_Binom <- pEstimado_Log_ClCr_Binom -1

logit_Log_ClCr_Binom<-log(pEstimado_Log_ClCr_Binom/(1-(pEstimado_Log_ClCr_Binom)))

plot(medias_Log_ClCr_Binom,logit_Log_ClCr_Binom,xlab="Media de Log_ClCr por clase",
     ylab="Logit de Probabilidad de Sangrado por clase",
     main= "Prueba de relación lineal: Log_ClCr dos grupos con Logit de probabilidad de
     sangrado",col="blue",pch=20, type="lowess")

c) Analisis univariado luego de analisis de sensibilidad

base_sens$Compl_Sang_Todos <- as.factor(base_sens$Compl_Sang_Todos)
#edad ninguno es significativo
summary(glm(Compl_Sang_Todos ~ Pac_Edad_Binom, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Pac_Edad_Binom, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.451  -0.451  -0.382  -0.382   2.305  

Coefficients:
               Estimate Std. Error z value  Pr(>|z|)    
(Intercept)      -1.890      0.423   -4.47 0.0000079 ***
Pac_Edad_Binom   -0.347      0.280   -1.24      0.21    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 390.84  on 682  degrees of freedom
AIC: 394.8

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Pac_Edad_Terc, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Pac_Edad_Terc, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.468  -0.468  -0.413  -0.365   2.343  

Coefficients:
              Estimate Std. Error z value    Pr(>|z|)    
(Intercept)     -1.895      0.348   -5.45 0.000000051 ***
Pac_Edad_Terc   -0.261      0.172   -1.52        0.13    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 390.06  on 682  degrees of freedom
AIC: 394.1

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Pac_Edad_Cuart, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Pac_Edad_Cuart, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.456  -0.429  -0.403  -0.378   2.313  

Coefficients:
               Estimate Std. Error z value      Pr(>|z|)    
(Intercept)      -2.080      0.325   -6.39 0.00000000016 ***
Pac_Edad_Cuart   -0.131      0.125   -1.05          0.29    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.28  on 682  degrees of freedom
AIC: 395.3

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Pac_Edad_Quint, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Pac_Edad_Quint, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.455  -0.435  -0.416  -0.380   2.309  

Coefficients:
               Estimate Std. Error z value      Pr(>|z|)    
(Intercept)     -2.1219     0.3119   -6.80 0.00000000001 ***
Pac_Edad_Quint  -0.0946     0.0984   -0.96          0.34    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.46  on 682  degrees of freedom
AIC: 395.5

Number of Fisher Scoring iterations: 5
#FR terciles es significativo
summary(glm(Compl_Sang_Todos ~ CC_FR_Ingreso_Binom, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ CC_FR_Ingreso_Binom, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.465  -0.465  -0.365  -0.365   2.342  

Coefficients:
                    Estimate Std. Error z value       Pr(>|z|)    
(Intercept)           -3.183      0.476   -6.69 0.000000000022 ***
CC_FR_Ingreso_Binom    0.506      0.284    1.78          0.074 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 389.13  on 682  degrees of freedom
AIC: 393.1

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ CC_FR_Ingreso_Terc, data = base_sens, family = binomial (link = logit))) #0.06

Call:
glm(formula = Compl_Sang_Todos ~ CC_FR_Ingreso_Terc, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.468  -0.468  -0.413  -0.365   2.343  

Coefficients:
                   Estimate Std. Error z value          Pr(>|z|)    
(Intercept)          -2.938      0.394   -7.46 0.000000000000084 ***
CC_FR_Ingreso_Terc    0.261      0.172    1.52              0.13    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 390.06  on 682  degrees of freedom
AIC: 394.1

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ CC_FR_Ingreso_Cuart, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ CC_FR_Ingreso_Cuart, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.470  -0.432  -0.397  -0.364   2.344  

Coefficients:
                    Estimate Std. Error z value           Pr(>|z|)    
(Intercept)           -2.858      0.363   -7.86 0.0000000000000037 ***
CC_FR_Ingreso_Cuart    0.177      0.125    1.42               0.16    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 390.36  on 682  degrees of freedom
AIC: 394.4

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ CC_FR_Ingreso_Quint, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ CC_FR_Ingreso_Quint, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.479  -0.445  -0.413  -0.355   2.364  

Coefficients:
                    Estimate Std. Error z value            Pr(>|z|)    
(Intercept)          -2.8868     0.3516   -8.21 <0.0000000000000002 ***
CC_FR_Ingreso_Quint   0.1564     0.0993    1.58                0.12    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 389.88  on 682  degrees of freedom
AIC: 393.9

Number of Fisher Scoring iterations: 5
#FC todos significativos pero terciles lineal
summary(glm(Compl_Sang_Todos ~ Log_FC_Binom, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Log_FC_Binom, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.485  -0.485  -0.338  -0.338   2.404  

Coefficients:
             Estimate Std. Error z value         Pr(>|z|)    
(Intercept)    -3.587      0.502   -7.14 0.00000000000095 ***
Log_FC_Binom    0.754      0.292    2.58           0.0099 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 385.36  on 682  degrees of freedom
AIC: 389.4

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Log_FC_Terc, data = base_sens, family = binomial (link = logit))) #0.007

Call:
glm(formula = Compl_Sang_Todos ~ Log_FC_Terc, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.507  -0.507  -0.405  -0.322   2.443  

Coefficients:
            Estimate Std. Error z value            Pr(>|z|)    
(Intercept)   -3.407      0.424   -8.04 0.00000000000000094 ***
Log_FC_Terc    0.474      0.178    2.67              0.0076 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 384.93  on 682  degrees of freedom
AIC: 388.9

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Log_FC_Cuart, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Log_FC_Cuart, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.507  -0.439  -0.379  -0.327   2.432  

Coefficients:
             Estimate Std. Error z value            Pr(>|z|)    
(Intercept)    -3.210      0.386   -8.32 <0.0000000000000002 ***
Log_FC_Cuart    0.305      0.128    2.39               0.017 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 386.50  on 682  degrees of freedom
AIC: 390.5

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Log_FC_Quint, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Log_FC_Quint, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.527  -0.462  -0.405  -0.309   2.475  

Coefficients:
             Estimate Std. Error z value            Pr(>|z|)    
(Intercept)    -3.294      0.379   -8.69 <0.0000000000000002 ***
Log_FC_Quint    0.278      0.102    2.72              0.0066 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 384.68  on 682  degrees of freedom
AIC: 388.7

Number of Fisher Scoring iterations: 5
#TAS terciles borderline y lineal
summary(glm(Compl_Sang_Todos ~ Log_TAS_Binom, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Log_TAS_Binom, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.436  -0.436  -0.398  -0.398   2.270  

Coefficients:
              Estimate Std. Error z value  Pr(>|z|)    
(Intercept)     -2.114      0.428   -4.93 0.0000008 ***
Log_TAS_Binom   -0.192      0.278   -0.69      0.49    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.91  on 682  degrees of freedom
AIC: 395.9

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Log_TAS_Terc, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Log_TAS_Terc, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.468  -0.468  -0.413  -0.365   2.343  

Coefficients:
             Estimate Std. Error z value    Pr(>|z|)    
(Intercept)    -1.895      0.348   -5.45 0.000000051 ***
Log_TAS_Terc   -0.261      0.172   -1.52        0.13    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 390.06  on 682  degrees of freedom
AIC: 394.1

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Log_TAS_Cuart, data = base_sens, family = binomial (link = logit))) #13

Call:
glm(formula = Compl_Sang_Todos ~ Log_TAS_Cuart, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.474  -0.433  -0.395  -0.359   2.354  

Coefficients:
              Estimate Std. Error z value     Pr(>|z|)    
(Intercept)     -1.934      0.320   -6.04 0.0000000015 ***
Log_TAS_Cuart   -0.193      0.125   -1.54         0.12    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 389.99  on 682  degrees of freedom
AIC: 394

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Log_TAS_Quint, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Log_TAS_Quint, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.478  -0.445  -0.413  -0.356   2.361  

Coefficients:
              Estimate Std. Error z value      Pr(>|z|)    
(Intercept)    -1.9584     0.3056   -6.41 0.00000000015 ***
Log_TAS_Quint  -0.1531     0.0992   -1.54          0.12    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 389.98  on 682  degrees of freedom
AIC: 394

Number of Fisher Scoring iterations: 5
#Plaq nada es lineal ni significativo
summary(glm(Compl_Sang_Todos ~ Log_Lab_Plaq_Binom, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Log_Lab_Plaq_Binom, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.428  -0.428  -0.406  -0.406   2.253  

Coefficients:
                   Estimate Std. Error z value     Pr(>|z|)    
(Intercept)          -2.572      0.444   -5.79 0.0000000071 ***
Log_Lab_Plaq_Binom    0.115      0.277    0.41         0.68    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.22  on 682  degrees of freedom
AIC: 396.2

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Log_Lab_Plaq_Terc, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Log_Lab_Plaq_Terc, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.446  -0.446  -0.416  -0.388   2.290  

Coefficients:
                  Estimate Std. Error z value        Pr(>|z|)    
(Intercept)         -2.692      0.380   -7.08 0.0000000000014 ***
Log_Lab_Plaq_Terc    0.144      0.170    0.85             0.4    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.67  on 682  degrees of freedom
AIC: 395.7

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Log_Lab_Plaq_Cuart, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Log_Lab_Plaq_Cuart, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.429  -0.421  -0.413  -0.406   2.253  

Coefficients:
                   Estimate Std. Error z value         Pr(>|z|)    
(Intercept)         -2.4944     0.3435   -7.26 0.00000000000038 ***
Log_Lab_Plaq_Cuart   0.0383     0.1238    0.31             0.76    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.30  on 682  degrees of freedom
AIC: 396.3

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Log_Lab_Plaq_Quint, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Log_Lab_Plaq_Quint, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.422  -0.419  -0.417  -0.413   2.239  

Coefficients:
                   Estimate Std. Error z value          Pr(>|z|)    
(Intercept)         -2.4315     0.3260   -7.46 0.000000000000088 ***
Log_Lab_Plaq_Quint   0.0112     0.0979    0.11              0.91    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.38  on 682  degrees of freedom
AIC: 396.4

Number of Fisher Scoring iterations: 5
#GB terciles significativo y lineal
summary(glm(Compl_Sang_Todos ~ Log_Lab_GB_Binom, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Log_Lab_GB_Binom, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.505  -0.505  -0.310  -0.310   2.475  

Coefficients:
                 Estimate Std. Error z value          Pr(>|z|)    
(Intercept)        -4.035      0.538   -7.49 0.000000000000067 ***
Log_Lab_GB_Binom    1.021      0.305    3.34           0.00083 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 380.05  on 682  degrees of freedom
AIC: 384

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Log_Lab_GB_Terc, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Log_Lab_GB_Terc, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.502  -0.502  -0.406  -0.328   2.428  

Coefficients:
                Estimate Std. Error z value           Pr(>|z|)    
(Intercept)       -3.337      0.419   -7.96 0.0000000000000017 ***
Log_Lab_GB_Terc    0.442      0.176    2.51              0.012 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 385.85  on 682  degrees of freedom
AIC: 389.8

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Log_Lab_GB_Cuart, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Log_Lab_GB_Cuart, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.525  -0.441  -0.369  -0.308   2.480  

Coefficients:
                 Estimate Std. Error z value            Pr(>|z|)    
(Intercept)        -3.399      0.399   -8.51 <0.0000000000000002 ***
Log_Lab_GB_Cuart    0.372      0.130    2.86              0.0042 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 383.79  on 682  degrees of freedom
AIC: 387.8

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Log_Lab_GB_Quint, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Log_Lab_GB_Quint, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.539  -0.466  -0.402  -0.298   2.506  

Coefficients:
                 Estimate Std. Error z value            Pr(>|z|)    
(Intercept)        -3.404      0.387    -8.8 <0.0000000000000002 ***
Log_Lab_GB_Quint    0.309      0.103     3.0              0.0027 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 382.92  on 682  degrees of freedom
AIC: 386.9

Number of Fisher Scoring iterations: 5
#ClCr no es significativo ni lineal
summary(glm(Compl_Sang_Todos ~ Log_ClCr_Binom, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Log_ClCr_Binom, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.443  -0.443  -0.390  -0.390   2.287  

Coefficients:
               Estimate Std. Error z value      Pr(>|z|)    
(Intercept)      -2.809      0.455   -6.17 0.00000000067 ***
Log_ClCr_Binom    0.269      0.279    0.97          0.33    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.45  on 682  degrees of freedom
AIC: 395.5

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Log_ClCr_Terc, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Log_ClCr_Terc, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.429  -0.429  -0.417  -0.406   2.253  

Coefficients:
              Estimate Std. Error z value       Pr(>|z|)    
(Intercept)    -2.5137     0.3713   -6.77 0.000000000013 ***
Log_ClCr_Terc   0.0574     0.1696    0.34           0.73    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.28  on 682  degrees of freedom
AIC: 396.3

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Log_ClCr_Cuart, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Log_ClCr_Cuart, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.442  -0.425  -0.408  -0.392   2.283  

Coefficients:
               Estimate Std. Error z value          Pr(>|z|)    
(Intercept)     -2.6125     0.3496   -7.47 0.000000000000079 ***
Log_ClCr_Cuart   0.0844     0.1241    0.68               0.5    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 391.93  on 682  degrees of freedom
AIC: 395.9

Number of Fisher Scoring iterations: 5
summary(glm(Compl_Sang_Todos ~ Log_ClCr_Quint, data = base_sens, family = binomial (link = logit)))

Call:
glm(formula = Compl_Sang_Todos ~ Log_ClCr_Quint, family = binomial(link = logit), 
    data = base_sens)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.437  -0.427  -0.417  -0.397   2.271  

Coefficients:
               Estimate Std. Error z value          Pr(>|z|)    
(Intercept)     -2.5485     0.3321   -7.67 0.000000000000017 ***
Log_ClCr_Quint   0.0496     0.0980    0.51              0.61    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 392.39  on 683  degrees of freedom
Residual deviance: 392.14  on 682  degrees of freedom
AIC: 396.1

Number of Fisher Scoring iterations: 5
  • La transformación de variables o separación en terciles-cuartiles no aporta información util para EDAD, PLAQUETAS ni ClCr. Por ende estas variables no podrían ser consideradas en un análisis de regresión logística. Para la transformación de GB, TAS, FC y FR hay significación estadística en modelo univariado si se los divide en terciles.

7) Métodos de selección de variables no convencionales

  • Para estos métodos de selección automáticos decidimos eliminar las variables que no son de interés para el propósito de este trabajo.

Por un lado se decide no analizar scores por los siguientes motivos: - Score de RIETE: fue diseñado para trombosis venosa profunda y tromboembolismo de pulmon. Esta población solo incluye pacientes con tromboembolismo pulmonar, por lo cuál el score siempre puntua 1 o más. - Score de PESI fue ideado para evaluar mortalidad. - Score de Wells fue ideado para evaluar la probabilidad pre-test de TEP.

Se deja solamente el score de HASBLED, con la salvedad de que este score fue cargado por el personal que llenaba la base y no se constataron todas las variables de forma separada (uso de antiagregantes, hipertensión descontrolada).

Por otro lado se eliminan las variables que no influyen en el sangrado sino que son consecuencia temporal posterior al mismo: uso de filtro de VCI (FVCI).

Decidimos eliminar las siguientes variables PESI_Taquicardia, PESI_Hipotensión, PESI_Taquipnea, PESI_Hipotermia y CC_SaO90 (saturacíon menor a 90%) ya que incluiremos las variables continuas en el análisis: FR, FC, TAS y saturación de oxígeno aire ambiente al ingreso.

Se eliminan otras variables que tampoco son de interes para el analisis: Servicio a Cargo, Motivo de Internación, Uso de DOACs al alta, Tipo de ACO al alta (la mayoria de los pacientes sangraron en la internacion y no en el seguimienoto a 30 días), uso de ACO en la internación (solamente 3 de 23 pacientes no recibieron anticoagulacion por sangrado), Alta carga trombótica por TAC, Complicaciones hemodinámicas en la internación.

Se decidió incluir las variables TEP/TVP previo global y Hemorragia Mayor global en vez de las variables TEP previo menor a 3 meses y Hemorragia mayor reciente.

Dejamos solamente la variable Clearence de creatinina ya que es la que mejor correlaciona, eliminamos para estos métodos de selección Pac_IRC_Global, Lab_Cr.

Por otro lado, se tomo la decisión de dictomizar la variable Motivo de internación en 2: por TEP o no por TEP, debido a la poca cantidad de casos por otros motivos no se pudo realizar un análisis con más categorías. También se dicotomizó la variable Edad en mayores o menores de 75 años, ya que la variable cuantitativa no cumple con el supuesto de linealidad y es de nuestro interés que sea agregada. La dicotomización en 75 se realizó por bibliografía, ya que scores como el de RIETE utilizan esta edad para evaluar el riesgo de sangrado.

  1. Selección de variables


base_imp <- base_backup
base_imp <- base_imp[,!names(base_imp) %in% c("Pac_IRCglobal","Lab_Cr", "ECOTT_DisfVD", "DOAC_si_vs_no","Alta_Tto_TiposACO", "FVCI", "TiempoInt", "RIETE_Grupo", "ACOint", "Pac_Reposo", "PESI_Hipotermia", "ECOTT_FSVI", "Int_O_Alto_Riesgo_Calc", "PESI_Taquicardia", "PESI_Taquipnea", "ServicioCargo", "TL_cual", "PESI_Det_Sens", "PESI_Hipotension", "CC_SaO90", "Pac_TEP_previo_menor_3_meses", "PESIECHO", "PESIcalc", "Wells", "HASBLED", "RIETE_Calc", "MotInt", "Trauma", "Tto_Reperf", "Compl_SoporteHD_NO", "Lab_Hb_Corte", "Lab_Plaq_Corte", "EstRiesgo", "Lab_Hto", "PESI_Calc", "PESIsCalc", "PESI_clasif", "Pac_Cobertura", "Pac_Edad_Corte", "Alta_Carga_Trombo_TAC", "miss.univ", "Pac_Hemorragia_Previa_Mayor_Reciente", "PESIs_Clasif", "IMC")]

a) Random Forest

  • El segundo método de análisis para la selección de variables es Random Forest. En este método no incluimos las variables transformadas.
base_imp <- map_if(.x = base_imp, .p = is.character, .f = as.factor) %>%
  as.data.frame()

modelo_randforest2 <- randomForest(formula = Compl_Sang_Todos ~ . , data = base_imp, mtry = 5,
                                  importance = TRUE, ntree = 1000)

importancia2 <- as.data.frame(modelo_randforest2$importance)
importancia2 <- rownames_to_column(importancia2, var = "variable")
importancia2 <- rename.variable(importancia2, "%IncMSE", "MeanDecreaseAccuracy")
importancia2 <- rename.variable(importancia2, "IncNodePurity", "MeanDecreaseGini")


p1_2 <- ggplot (data = importancia2, aes ( x = reorder (variable, MeanDecreaseAccuracy), 
                                        y = MeanDecreaseAccuracy,
                                        fill = MeanDecreaseAccuracy)) + 
  labs (x = "variable", title = "Reduccion de Accuracy") +
  geom_col () +
  coord_flip () +
  theme_bw () + 
  theme(legend.position = "bottom")

p1_2

Se observan que las variables con mayor importancia son: ClCr, Edad, Hemoglobina, Peso, FC, PSAP, Plaquetas, Cirugía previa (Pac_Cx_Total), Saturación O2 y GB.

b) Lasso con todas las variables

  • Se decide realizar Lasso como tercera y úlitma forma de selección de variables.
x_2 <- model.matrix(Compl_Sang_Todos ~., base_imp)
y_2 <- base_imp$Compl_Sang_Todos

vis_miss(base_imp)


dim(x_2) #hay mas variables porque hace dummies de las categoricas ; )
[1] 684  34
lasso_m2 <- glmnet(x_2, y=as.factor(y_2),  alpha=1, family="binomial", lambda = NULL)

plot(lasso_m2,xvar="lambda",label=TRUE)

plot(lasso_m2,xvar="norm",label=TRUE)


set.seed(1)
lasso_m2_cv <-  cv.glmnet(x_2, y=as.factor(y_2),  alpha=1, family="binomial", nfolds=10)

# guardar los lambdas
min_lambda_lasso_m2_cv <- lasso_m2_cv$lambda.min
best_lambda_lasso_m2_cv <- lasso_m2_cv$lambda.1se

plot(lasso_m2_cv)
abline(v=log(min_lambda_lasso_m2_cv), col="blue")
abline(v=log(best_lambda_lasso_m2_cv), col="orange")


#### se calculan los coeficientes para el lambda seleccionado
vars_lambda_best <- predict(lasso_m2_cv, type="coefficients", s=best_lambda_lasso_m2_cv)
vars_lambda_min <- predict(lasso_m2_cv, type="coefficients", s=min_lambda_lasso_m2_cv)

lasso_m3 <- glmnet(x_2, y=as.factor(y_2),  alpha=1, family="binomial", lambda = min_lambda_lasso_m2_cv)
coef(lasso_m3)
35 x 1 sparse Matrix of class "dgCMatrix"
                                            s0
(Intercept)                          1.3382023
(Intercept)                          .        
Pac_SexMasculino                     0.0130201
Pac_Edad                            -0.0017390
Pac_HTASi                            .        
Pac_DBTSi                            .        
Pac_TBQNo                            .        
Pac_TBQTabaquista                    .        
Pac_DLPSi                            .        
Pac_ICCSi                            .        
Pac_FASi                             .        
Pac_ETVpreSi                        -0.2363857
Pac_DeambSi                          .        
Pac_EPOCSi                           .        
Pac_ACVglobalSi                      .        
Pac_Hemorragia_Previa_Mayor_TodasSi  .        
Pac_EnfAutoSi                        .        
Pac_SmeProcoagSi                    -0.4408059
PESI_CancerSi                        .        
Pac_ACO_PreviaSi                     .        
Peso                                 .        
CC_Horas_Sx_Admision                 .        
CC_FC_Ingreso                        0.0026941
CC_TAS_Ingreso                      -0.0025190
CC_FR_Ingreso                        .        
CC_SaO_Ingreso                      -0.0202962
Pac_Cx_TotalSi                       0.2433858
Lab_Hb                              -0.0796566
Lab_GB                               0.0000114
Lab_Plaq                             .        
Biomarc_posSi                        0.0918273
ECOTT_TAPSE                         -0.0526060
ECOTT_PSAP                           0.0026498
ClCr                                 .        
TEP_motivo_intSi                    -0.2181575

Las variaboes significativas son: ACV, Hemorragia Mayor Previa, FC, TAS, Saturación O2, Cirugía previa, Hb, GB, Biomarcadores y TAPSE.

MODELOS DE REGRESIÓN

8) Analisis multivariado con base imputada con Cross Validation con método “Leave one out”

a) Modelo de regresión logística con variables seleccionadas por analisis univariado


base_validation <- base_backup
base_validation$CC_FR_Ingreso_Terc <- base_sens$CC_FR_Ingreso_Terc
base_validation$Log_Lab_GB_Terc <- base_sens$Log_Lab_GB_Terc
base_validation$Log_TAS_Terc <- base_sens$Log_TAS_Terc
base_validation$Log_FC_Terc  <- base_sens$Log_FC_Terc

base_validation$sangrado_recod <- base_imp$Compl_Sang_Todos
base_validation$sangrado_recod <- as.factor(base_validation$sangrado_recod)

base_validation$Lab_Plaq_Corte <- ifelse (base_validation$Lab_Plaq <= 100000, 1, 0)
base_validation$Pac_Edad_Corte <- ifelse (base_validation$Pac_Edad >= 75, 1, 0)

base_validation1 <- base_validation
base_validation11 <- base_validation

library(caret)

fitControl <- trainControl(
  method = "LOOCV", #leave one out cross validation
  classProbs = T,
  summaryFunction = twoClassSummary )


LOOCV_m7 = train(
  form = sangrado_recod ~ Pac_ACVglobal + Pac_Hemorragia_Previa_Mayor_Todas + Pac_IRCglobal + Pac_Cx_Total + ECOTT_DisfVD + Lab_Hb + Log_Lab_GB_Terc + Log_TAS_Terc + Log_FC_Terc,
  data = base_validation11,
  trControl = fitControl,
  method = "glm",
  family = "binomial",
  metric = "ROC")

LOOCV_m7$pred
LOOCV_m7$results  #salen al reves sensibilidad y especificidad
LOOCV_m7$pred

# calculamos todas las metricas
roc_LOOCV_m7<- roc(base_validation1$sangrado_recod ~ LOOCV_m7$pred[ , 4], auc=TRUE, ci=TRUE, plot=FALSE)
Setting levels: control = No, case = Si
Setting direction: controls < cases
Rta_predicha_LOOCV_m7 <- ifelse(LOOCV_m7$pred[,4]>0.3, 1, 0)

table(base_validation1$sangrado_recod , Rta_predicha_LOOCV_m7)
    Rta_predicha_LOOCV_m7
       0   1
  No 621   6
  Si  56   1
table(base_imp$Compl_Sang_Todos, Rta_predicha_LOOCV_m7)
    Rta_predicha_LOOCV_m7
       0   1
  No 621   6
  Si  56   1
Rta_predicha_LOOCV_m7 <- as.factor(Rta_predicha_LOOCV_m7)
levels(Rta_predicha_LOOCV_m7) <- c("No", "Si")
base_imp$Compl_Sang_Todos <- as.factor(base_imp$Compl_Sang_Todos)
levels(base_imp$Compl_Sang_Todos) <- c("No", "Si")
table(base_imp$Compl_Sang_Todos, Rta_predicha_LOOCV_m7)
    Rta_predicha_LOOCV_m7
      No  Si
  No 621   6
  Si  56   1
LOOCV_m7_sensibilidad <- caret::sensitivity(base_imp$Compl_Sang_Todos , Rta_predicha_LOOCV_m7, positive="Si", negative = "No")
LOOCV_m7_especificidad <- caret::specificity(base_imp$Compl_Sang_Todos , Rta_predicha_LOOCV_m7, positive="Si", negative = "No")
LOOCV_m7_AUCROC <- roc_LOOCV_m7$auc
LOOCV_m7_accuracy <- mean(base_imp$Compl_Sang_Todos == Rta_predicha_LOOCV_m7)
LOOCV_m7_precision <- caret::precision(base_imp$Compl_Sang_Todos,Rta_predicha_LOOCV_m7)
LOOCV_m7_VPN <- caret::negPredValue(base_imp$Compl_Sang_Todos,Rta_predicha_LOOCV_m7)
LOOCV_m7_TFP <- 1-LOOCV_m7_especificidad

plot(LOOCV_m7$finalModel)

NA

b) Modelo de regresión logistica en base a selección de variables con método de Lasso

Utilizamos las variables cuantitativas que cumplen con criterio de linealidad de logits En el caso de las variables FC, TAS, SatO2 y GB usamos las variables transformadas.


base_validation$CC_FR_Ingreso_Terc <- base_sens$CC_FR_Ingreso_Terc
base_validation$Log_Lab_GB_Terc <- base_sens$Log_Lab_GB_Terc
base_validation$Log_TAS_Terc <- base_sens$Log_TAS_Terc
base_validation$Log_FC_Terc  <- base_sens$Log_FC_Terc
base_validation$Log_CC_SaO_Ingreso <- base_logit2$Log_CC_SaO_Ingreso

base_validation2 <- base_validation

fitControl <- trainControl(
  method = "LOOCV", #leave one out cross validation
  classProbs = T,
  summaryFunction = twoClassSummary )


LOOCV_m6= train(
  form = sangrado_recod ~ Pac_ACVglobal + Pac_Hemorragia_Previa_Mayor_Todas + Biomarc_pos + Lab_Hb + Log_Lab_GB_Terc + ECOTT_TAPSE + Log_FC_Terc + Log_TAS_Terc + Log_CC_SaO_Ingreso + Pac_Cx_Total,
  data = base_validation2,
  trControl = fitControl,
  method = "glm",
  family = "binomial",
  metric = "ROC"
)

# La métrica por defecto es accuracy. Se pueden setear otras como ROC y se pueden crear las propias
# Como aca no estamos tuneando ningun parametro, podemos usar las propabilidades predichas finales del LOOCV
# Con las probabilidades predichas podemos hacer lo que nos venga mejor
# Si usamos otros algoritmos/metodos durante el proceso de train se ajustan parametros iterativamente y ahi la métrica que
# se pone (aca "ROC") tiene mas peso.

# Para ver el resultado solo basta con poner el nombre del objeto

LOOCV_m6
Generalized Linear Model 

684 samples
 10 predictor
  2 classes: 'No', 'Si' 

No pre-processing
Resampling: Leave-One-Out Cross-Validation 
Summary of sample sizes: 683, 683, 683, 683, 683, 683, ... 
Resampling results:

  ROC    Sens   Spec  
  0.656  0.998  0.0175
LOOCV_m6$results
LOOCV_m6$pred
# aca como elegimos LOOCV hay un valor predicho para cada uno, si elegimos k-fold-CV el resultado es un medida con su SD

# ahora calculamos todas las metricas

roc_LOOCV_m6<- roc(base_validation2$sangrado_recod  ~ LOOCV_m6$pred[,4], auc=TRUE, ci=TRUE, plot=FALSE)
Setting levels: control = No, case = Si
Setting direction: controls < cases
Rta_predicha_LOOCV_m6 <- ifelse(LOOCV_m6$pred[,4]>0.3, 1, 0)

table(base_imp$Compl_Sang_Todos, Rta_predicha_LOOCV_m6)
    Rta_predicha_LOOCV_m6
       0   1
  No 618   9
  Si  53   4
Rta_predicha_LOOCV_m6 <- as.factor(Rta_predicha_LOOCV_m6)
levels(Rta_predicha_LOOCV_m6) <- c("No", "Si")
base_imp$Compl_Sang_Todos <- as.factor(base_imp$Compl_Sang_Todos)
levels(base_imp$Compl_Sang_Todos) <- c("No", "Si")
table(base_imp$Compl_Sang_Todos, Rta_predicha_LOOCV_m6)
    Rta_predicha_LOOCV_m6
      No  Si
  No 618   9
  Si  53   4
LOOCV_m6_sensibilidad <- caret::sensitivity(base_imp$Compl_Sang_Todos , Rta_predicha_LOOCV_m6, positive="Si", negative = "No")
LOOCV_m6_especificidad <- caret::specificity(base_imp$Compl_Sang_Todos , Rta_predicha_LOOCV_m6, positive="Si", negative = "No")
LOOCV_m6_AUCROC <- roc_LOOCV_m6$auc
LOOCV_m6_accuracy <- mean(base_imp$Compl_Sang_Todos == Rta_predicha_LOOCV_m6)
LOOCV_m6_precision <- caret::precision(base_imp$Compl_Sang_Todos,Rta_predicha_LOOCV_m6)
LOOCV_m6_VPN <- caret::negPredValue(base_imp$Compl_Sang_Todos,Rta_predicha_LOOCV_m6)
LOOCV_m6_TFP <- 1-LOOCV_m6_especificidad
plot(LOOCV_m6$finalModel)

NA
NA
NA

c) Modelo de regresión logistica en base a Random Forest

Utilizamos las variables cuantitativas que cumplen con criterio de linealidad de logits En el caso de las variables FC, TAS, SatO2 y GB usamos las variables transformadas.

base_validation$CC_FR_Ingreso_Terc <- base_sens$CC_FR_Ingreso_Terc
base_validation$Log_Lab_GB_Terc <- base_sens$Log_Lab_GB_Terc
base_validation$Log_TAS_Terc <- base_sens$Log_TAS_Terc
base_validation$Log_FC_Terc  <- base_sens$Log_FC_Terc
base_validation$Log_CC_SaO_Ingreso <- base_logit2$Log_CC_SaO_Ingreso

base_validation3 <- base_validation

LOOCV_m9rf = train(
  form = sangrado_recod ~ Lab_Hb + Log_FC_Terc + ECOTT_PSAP + Log_TAS_Terc + Pac_Cx_Total + Log_CC_SaO_Ingreso + Log_Lab_GB_Terc,
  data = base_validation3,
  trControl = fitControl,
  method = "glm",
  family = "binomial",
  metric = "ROC"
)

# nuevamente extraemos las probabilidades y calculamos las metricas

roc_LOOCV_m9rf<- roc(base_validation3$sangrado_recod  ~ LOOCV_m9rf$pred[,4], auc=TRUE, ci=TRUE, plot=FALSE)
Setting levels: control = No, case = Si
Setting direction: controls < cases
Rta_predicha_LOOCV_m9rf <- ifelse(LOOCV_m9rf$pred[,4]>0.3, 1, 0)
#Rta_predicha_LOOCV_m9rf <- as.factor(Rta_predicha_LOOCV_m9rf)

table(base_imp$Compl_Sang_Todos, Rta_predicha_LOOCV_m9rf)
    Rta_predicha_LOOCV_m9rf
       0   1
  No 618   9
  Si  55   2
Rta_predicha_LOOCV_m9rf <- as.factor(Rta_predicha_LOOCV_m9rf)
levels(Rta_predicha_LOOCV_m9rf) <- c("No", "Si")
base_imp$Compl_Sang_Todos <- as.factor(base_imp$Compl_Sang_Todos)
levels(base_imp$Compl_Sang_Todos) <- c("No", "Si")
table(base_imp$Compl_Sang_Todos, Rta_predicha_LOOCV_m9rf)
    Rta_predicha_LOOCV_m9rf
      No  Si
  No 618   9
  Si  55   2
LOOCV_m9rf_sensibilidad <- caret::sensitivity(base_imp$Compl_Sang_Todos , Rta_predicha_LOOCV_m9rf, positive="Si", negative = "No")
LOOCV_m9rf_especificidad <- caret::specificity(base_imp$Compl_Sang_Todos , Rta_predicha_LOOCV_m9rf, positive="Si", negative = "No")
LOOCV_m9rf_AUCROC <- roc_LOOCV_m9rf$auc
LOOCV_m9rf_accuracy <- mean(base_imp$Compl_Sang_Todos == Rta_predicha_LOOCV_m9rf)
LOOCV_m9rf_precision <- caret::precision(base_imp$Compl_Sang_Todos,Rta_predicha_LOOCV_m9rf)
LOOCV_m9rf_VPN <- caret::negPredValue(base_imp$Compl_Sang_Todos,Rta_predicha_LOOCV_m9rf)
LOOCV_m9rf_TFP <- 1-LOOCV_m9rf_especificidad

plot(LOOCV_m9rf$finalModel)

NA

d) Modelo de regresión logística utilizando variables de Random Forest, Lasso, Univariado y otras variables apoyadas por la bibliografía

En este caso utilizaremos Edad >75 años y Plaquetas <100.000 como punto de corte

base_validation$CC_FR_Ingreso_Terc <- base_sens$CC_FR_Ingreso_Terc
base_validation$Log_Lab_GB_Terc <- base_sens$Log_Lab_GB_Terc
base_validation$Log_TAS_Terc <- base_sens$Log_TAS_Terc
base_validation$Log_FC_Terc  <- base_sens$Log_FC_Terc
base_validation$Log_CC_SaO_Ingreso <- base_logit2$Log_CC_SaO_Ingreso

base_validation4 <- base_validation

LOOCV_m8= train(
  form = sangrado_recod ~ Pac_IRCglobal  + Pac_Edad_Corte + Lab_Plaq_Corte + Pac_Hemorragia_Previa_Mayor_Reciente + Pac_Cx_Total + Lab_Hb,
  data = base_validation4,
  trControl = fitControl,
  method = "glm",
  family = "binomial",
  metric = "ROC"
)

LOOCV_m8
Generalized Linear Model 

684 samples
  6 predictor
  2 classes: 'No', 'Si' 

No pre-processing
Resampling: Leave-One-Out Cross-Validation 
Summary of sample sizes: 683, 683, 683, 683, 683, 683, ... 
Resampling results:

  ROC   Sens  Spec
  0.58  1     0   
LOOCV_m8$results  #salen al reves sensibilidad y especificidad
LOOCV_m8$pred

# calculamos todas las metricas

roc_LOOCV_m8<- roc(base_validation4$sangrado_recod  ~ LOOCV_m8$pred[,4], auc=TRUE, ci=TRUE, plot=FALSE)
Setting levels: control = No, case = Si
Setting direction: controls < cases
Rta_predicha_LOOCV_m8 <- ifelse(LOOCV_m8$pred[,4]>0.3, 1, 0)

table(base_imp$Compl_Sang_Todos, Rta_predicha_LOOCV_m8)
    Rta_predicha_LOOCV_m8
       0   1
  No 623   4
  Si  55   2
Rta_predicha_LOOCV_m8 <- as.factor(Rta_predicha_LOOCV_m8)
levels(Rta_predicha_LOOCV_m8) <- c("No", "Si")
base_imp$Compl_Sang_Todos <- as.factor(base_imp$Compl_Sang_Todos)
levels(base_imp$Compl_Sang_Todos) <- c("No", "Si")
table(base_imp$Compl_Sang_Todos, Rta_predicha_LOOCV_m8)
    Rta_predicha_LOOCV_m8
      No  Si
  No 623   4
  Si  55   2
LOOCV_m8_sensibilidad <- caret::sensitivity(base_imp$Compl_Sang_Todos , Rta_predicha_LOOCV_m8, positive="Si", negative = "No")
LOOCV_m8_especificidad <- caret::specificity(base_imp$Compl_Sang_Todos , Rta_predicha_LOOCV_m8, positive="Si", negative = "No")
LOOCV_m8_AUCROC <- roc_LOOCV_m8$auc
LOOCV_m8_accuracy <- mean(base_imp$Compl_Sang_Todos == Rta_predicha_LOOCV_m8)
LOOCV_m8_precision <- caret::precision(base_imp$Compl_Sang_Todos,Rta_predicha_LOOCV_m8)
LOOCV_m8_VPN <- caret::negPredValue(base_imp$Compl_Sang_Todos,Rta_predicha_LOOCV_m8)
LOOCV_m8_TFP <- 1-LOOCV_m8_especificidad


plot(LOOCV_m8$finalModel)

NA
NA

e) Modelo aditivo generalizado: GAM

En este modelo intentaremos incluir Edad, Plaquetas y ClCr que no cumplen con linealidad de logits. Además intentaremos modelar las variables sin transformar de GB y TAS, FC y SatO2 y FR.

i) Exploración de las variables no lineales

base_gam <- base_backup

library(gamlss)
Loading required package: splines
Loading required package: gamlss.data

Attaching package: ‘gamlss.data’

The following object is masked from ‘package:VIM’:

    sleep

The following object is masked from ‘package:boot’:

    aids

The following object is masked from ‘package:datasets’:

    sleep

Loading required package: gamlss.dist
Loading required package: parallel
 **********   GAMLSS Version 5.4-3  ********** 
For more on GAMLSS look at https://www.gamlss.com/
Type gamlssNews() to see new features/changes/bug fixes.


Attaching package: ‘gamlss’

The following object is masked from ‘package:lme4’:

    refit

The following object is masked from ‘package:glmmTMB’:

    refit

The following object is masked from ‘package:epiDisplay’:

    cs

The following object is masked from ‘package:caret’:

    calibration
library(ggpubr)
library(skimr)

Attaching package: ‘skimr’

The following object is masked from ‘package:naniar’:

    n_complete

The following object is masked from ‘package:corrr’:

    focus

The following object is masked from ‘package:sjmisc’:

    to_long
ggplot(data = base_gam, aes(x = Lab_Hb)) +
  geom_density(alpha = 0.5, fill = "gray50") +
  geom_rug(alpha = 0.2) +
  labs(title = "Distribución de Hb") +
  theme_bw()


ggplot(data = base_gam, aes(x = ClCr)) +
  geom_density(alpha = 0.5, fill = "gray50") +
  geom_rug(alpha = 0.2) +
  labs(title = "Distribución de ClCr") +
  theme_bw()


ggplot(data = base_gam, aes(x = Lab_Plaq)) +
  geom_density(alpha = 0.5, fill = "gray50") +
  geom_rug(alpha = 0.2) +
  labs(title = "Distribución de Plaq") +
  theme_bw()


ggplot(data = base_gam, aes(x = Lab_GB)) +
  geom_density(alpha = 0.5, fill = "gray50") +
  geom_rug(alpha = 0.2) +
  labs(title = "Distribución de GB") +
  theme_bw()


ggplot(data = base_gam, aes(x = Pac_Edad)) +
  geom_density(alpha = 0.5, fill = "gray50") +
  geom_rug(alpha = 0.2) +
  labs(title = "Distribución de Edad") +
  theme_bw()


#Modelo básico de regresión logistica, sin smooths, para poder comparar después
base_gam$Compl_Sang_Todos <- as.integer(base_gam$Compl_Sang_Todos) -1 
modelo_glm <- gamlss(
              formula = Compl_Sang_Todos ~  CC_TAS_Ingreso + (ClCr) + (Lab_Hb) + Lab_Plaq + Pac_Edad + CC_SaO_Ingreso + CC_FC_Ingreso + Lab_GB,
              family  = BI(mu.link = "logit"),
              data    = base_gam,
              trace   = FALSE
             )
summary(modelo_glm)
******************************************************************
Family:  c("BI", "Binomial") 

Call:  gamlss(formula = Compl_Sang_Todos ~ CC_TAS_Ingreso +      (ClCr) + (Lab_Hb) + Lab_Plaq + Pac_Edad + CC_SaO_Ingreso +  
    CC_FC_Ingreso + Lab_GB, family = BI(mu.link = "logit"),      data = base_gam, trace = FALSE) 

Fitting method: RS() 

------------------------------------------------------------------
Mu link function:  logit
Mu Coefficients:
                   Estimate   Std. Error t value Pr(>|t|)  
(Intercept)     4.130754128  2.420241100    1.71    0.088 .
CC_TAS_Ingreso -0.007652920  0.006735288   -1.14    0.256  
ClCr           -0.000325126  0.002872143   -0.11    0.910  
Lab_Hb         -0.154388585  0.073963373   -2.09    0.037 *
Lab_Plaq       -0.000000521  0.000012839   -0.04    0.968  
Pac_Edad       -0.010153411  0.009005908   -1.13    0.260  
CC_SaO_Ingreso -0.046127362  0.023143023   -1.99    0.047 *
CC_FC_Ingreso   0.009934584  0.006721784    1.48    0.140  
Lab_GB          0.000019287  0.000046923    0.41    0.681  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

------------------------------------------------------------------
No. of observations in the fit:  684 
Degrees of Freedom for the fit:  9
      Residual Deg. of Freedom:  675 
                      at cycle:  2 
 
Global Deviance:     369 
            AIC:     387 
            SBC:     428 
******************************************************************
plot(modelo_glm)
******************************************************************
     Summary of the Randomised Quantile Residuals
                           mean   =  0.0289 
                       variance   =  1 
               coef. of skewness  =  -0.0242 
               coef. of kurtosis  =  2.99 
Filliben correlation coefficient  =  1 
******************************************************************

wp(modelo_glm, ylim.all = 1)



#Exploracion de otras distribuciones que ajusten mejor
base_binom <- base_gam[,names(base_gam) %in% c("Compl_Sang_Todos", "Biomarc_pos" , "ECOTT_DisfVD", "ClCr", "Lab_Hb", "Lab_GB", "Pac_Edad", "CC_FC_Ingreso", "CC_TAS_Ingreso", "CC_SaO_Ingreso", "Pac_ACVglobal", "Pac_Cx_Total", "Pac_Hemorragia_Previa_Mayor_Todas")]

distribuciones <- fitDist(
                    base_binom$Compl_Sang_Todos,
                    k = 2, # esta penalización equivale al AIC
                    type = "binom",
                    trace = FALSE,
                    try.gamlss = TRUE
                  )

  |                                                                                                                                          
  |                                                                                                                                    |   0%
  |                                                                                                                                          
  |===================                                                                                                                 |  14%
  |                                                                                                                                          
  |======================================                                                                                              |  29%
  |                                                                                                                                          
  |=========================================================                                                                           |  43%
  |                                                                                                                                          
  |===========================================================================                                                         |  57%
  |                                                                                                                                          
  |==============================================================================================                                      |  71%
Error in solve.default(oout$hessian) : 
  Lapack routine dgesv: system is exactly singular: U[1,1] = 0

  |                                                                                                                                          
  |=================================================================================================================                   |  86%
  |                                                                                                                                          
  |====================================================================================================================================| 100%
distribuciones$fits %>%
  enframe(name = "distribucion", value = "GAIC") %>%
  arrange(GAIC)
distribuciones

Family:  c("BI", "Binomial") 
Fitting method: "nlminb" 

Call:  gamlssML(formula = y, family = BI) 

Mu Coefficients:
[1]  -2.4

 Degrees of Freedom for the fit: 1 Residual Deg. of Freedom   683 
Global Deviance:     392 
            AIC:     394 
            SBC:     399 
#Se explorò con otras distribuciones: BB, DBI, NBI, NBII. Por AIC el mejor modelo es con BI. 

#Aplicar smoothing a las variables continuas

#P-Splines (Penalized Smoothing Splines) a los predictores continuos del modelo. Esta función emplea el método de local maximum likelihood para seleccionar automáticamente los grados de libertad efectivos óptimos (flexibilidad).
modelo_glm2 <- gamlss(
              formula = Compl_Sang_Todos ~  pb(CC_TAS_Ingreso) + pb(ClCr) + pb(Lab_Hb) + pb(Lab_Plaq) + pb(Pac_Edad) + pb(CC_SaO_Ingreso) + pb(CC_FC_Ingreso) + pb(Lab_GB),
              family  = BI(mu.link = "logit"),
              data    = base_gam,
              trace   = FALSE
             )
Warning: additive.fit convergence not obtained in  30  iterationsWarning: additive.fit convergence not obtained in  30  iterationsWarning: additive.fit convergence not obtained in  30  iterations
summary(modelo_glm2)
******************************************************************
Family:  c("BI", "Binomial") 

Call:  gamlss(formula = Compl_Sang_Todos ~ pb(CC_TAS_Ingreso) +      pb(ClCr) + pb(Lab_Hb) + pb(Lab_Plaq) + pb(Pac_Edad) +  
    pb(CC_SaO_Ingreso) + pb(CC_FC_Ingreso) + pb(Lab_GB),      family = BI(mu.link = "logit"), data = base_gam,      trace = FALSE) 

Fitting method: RS() 

------------------------------------------------------------------
Mu link function:  logit
Mu Coefficients:
                       Estimate   Std. Error t value Pr(>|t|)  
(Intercept)         3.426289683  2.162051784    1.58     0.11  
pb(CC_TAS_Ingreso) -0.006174952  0.006680584   -0.92     0.36  
pb(ClCr)            0.000343694  0.002995780    0.11     0.91  
pb(Lab_Hb)         -0.140895979  0.064770486   -2.18     0.03 *
pb(Lab_Plaq)       -0.000000893  0.000012832   -0.07     0.94  
pb(Pac_Edad)       -0.010852622  0.009003372   -1.21     0.23  
pb(CC_SaO_Ingreso) -0.030686092  0.020926442   -1.47     0.14  
pb(CC_FC_Ingreso)   0.010804077  0.007192880    1.50     0.13  
pb(Lab_GB)         -0.000066456  0.000043404   -1.53     0.13  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

------------------------------------------------------------------
NOTE: Additive smoothing terms exist in the formulas: 
 i) Std. Error for smoothers are for the linear effect only. 
ii) Std. Error for the linear terms maybe are not accurate. 
------------------------------------------------------------------
No. of observations in the fit:  684 
Degrees of Freedom for the fit:  14.7
      Residual Deg. of Freedom:  669 
                      at cycle:  7 
 
Global Deviance:     350 
            AIC:     380 
            SBC:     447 
******************************************************************
plot(modelo_glm2)
******************************************************************
     Summary of the Randomised Quantile Residuals
                           mean   =  -0.00585 
                       variance   =  0.961 
               coef. of skewness  =  0.0261 
               coef. of kurtosis  =  3.05 
Filliben correlation coefficient  =  0.999 
******************************************************************

wp(modelo_glm2, ylim.all = 1)


#La función cs() permite incorporar Cubic Splines a los predictores continuos del modelo. A diferencia de pb(), en este caso sí es necesario especificar los grados de libertad.
modelo_glm4 <- gamlss(
              formula = Compl_Sang_Todos ~   cs(CC_TAS_Ingreso, df = 2) + cs(ClCr, df = 2) + cs(Lab_Hb, df = 2) + cs(Lab_Plaq, df = 2) + cs(Pac_Edad, df = 2) + cs(CC_SaO_Ingreso, df = 2) + cs(CC_FC_Ingreso, df = 2) + cs(Lab_GB, df = 2),
              family  = BI(mu.link = "logit"),
              data    = base_gam,
              trace   = FALSE
             )
summary(modelo_glm4)
******************************************************************
Family:  c("BI", "Binomial") 

Call:  gamlss(formula = Compl_Sang_Todos ~ cs(CC_TAS_Ingreso,      df = 2) + cs(ClCr, df = 2) + cs(Lab_Hb, df = 2) +  
    cs(Lab_Plaq, df = 2) + cs(Pac_Edad, df = 2) + cs(CC_SaO_Ingreso,      df = 2) + cs(CC_FC_Ingreso, df = 2) + cs(Lab_GB,  
    df = 2), family = BI(mu.link = "logit"), data = base_gam,      trace = FALSE) 

Fitting method: RS() 

------------------------------------------------------------------
Mu link function:  logit
Mu Coefficients:
                             Estimate Std. Error t value Pr(>|t|)  
(Intercept)                 1.7830071  2.3433231    0.76     0.45  
cs(CC_TAS_Ingreso, df = 2) -0.0059450  0.0071826   -0.83     0.41  
cs(ClCr, df = 2)            0.0008691  0.0032423    0.27     0.79  
cs(Lab_Hb, df = 2)         -0.1517990  0.0698363   -2.17     0.03 *
cs(Lab_Plaq, df = 2)       -0.0000011  0.0000128   -0.09     0.93  
cs(Pac_Edad, df = 2)       -0.0111952  0.0095433   -1.17     0.24  
cs(CC_SaO_Ingreso, df = 2) -0.0255051  0.0224931   -1.13     0.26  
cs(CC_FC_Ingreso, df = 2)   0.0116604  0.0077269    1.51     0.13  
cs(Lab_GB, df = 2)          0.0000271  0.0000478    0.57     0.57  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

------------------------------------------------------------------
NOTE: Additive smoothing terms exist in the formulas: 
 i) Std. Error for smoothers are for the linear effect only. 
ii) Std. Error for the linear terms maybe are not accurate. 
------------------------------------------------------------------
No. of observations in the fit:  684 
Degrees of Freedom for the fit:  25
      Residual Deg. of Freedom:  659 
                      at cycle:  2 
 
Global Deviance:     336 
            AIC:     386 
            SBC:     499 
******************************************************************
plot(modelo_glm4)
******************************************************************
     Summary of the Randomised Quantile Residuals
                           mean   =  -0.0104 
                       variance   =  1.04 
               coef. of skewness  =  0.0168 
               coef. of kurtosis  =  2.96 
Filliben correlation coefficient  =  0.999 
******************************************************************

wp(modelo_glm4, ylim.all = 1)



#Hay métodos con redes neuronales para smoothing pero preferimos no meternos en ese territorio

###SELECCION DEL MEJOR MODELO###
GAIC(modelo_glm, modelo_glm2,modelo_glm4)
#La mejor función smooth es con GLM2, es decir con P-splines Penalized Smoothing Splines.

#Ahora sacamos las variables que no son significativas y exploramos incluyendo las categóricas:
modelo_glm2_1 <- gamlss(
              formula = Compl_Sang_Todos ~  pb(ClCr) + pb(Lab_Hb) + pb(Lab_Plaq) + pb(CC_FC_Ingreso) + pb(Lab_GB),
              family  = BI(mu.link = "logit"),
              data    = base_gam,
              trace   = FALSE
             )
Warning: additive.fit convergence not obtained in  30  iterationsWarning: additive.fit convergence not obtained in  30  iterations
summary(modelo_glm2_1)
******************************************************************
Family:  c("BI", "Binomial") 

Call:  gamlss(formula = Compl_Sang_Todos ~ pb(ClCr) + pb(Lab_Hb) +      pb(Lab_Plaq) + pb(CC_FC_Ingreso) + pb(Lab_GB),  
    family = BI(mu.link = "logit"), data = base_gam,      trace = FALSE) 

Fitting method: RS() 

------------------------------------------------------------------
Mu link function:  logit
Mu Coefficients:
                     Estimate  Std. Error t value Pr(>|t|)  
(Intercept)       -1.12541967  0.95099511   -1.18    0.237  
pb(ClCr)           0.00179779  0.00269113    0.67    0.504  
pb(Lab_Hb)        -0.14236010  0.06466525   -2.20    0.028 *
pb(Lab_Plaq)      -0.00000111  0.00001283   -0.09    0.931  
pb(CC_FC_Ingreso)  0.01202378  0.00667343    1.80    0.072 .
pb(Lab_GB)        -0.00005690  0.00003705   -1.54    0.125  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

------------------------------------------------------------------
NOTE: Additive smoothing terms exist in the formulas: 
 i) Std. Error for smoothers are for the linear effect only. 
ii) Std. Error for the linear terms maybe are not accurate. 
------------------------------------------------------------------
No. of observations in the fit:  684 
Degrees of Freedom for the fit:  12.7
      Residual Deg. of Freedom:  671 
                      at cycle:  6 
 
Global Deviance:     356 
            AIC:     382 
            SBC:     439 
******************************************************************
plot(modelo_glm2_1)
******************************************************************
     Summary of the Randomised Quantile Residuals
                           mean   =  0.0142 
                       variance   =  0.921 
               coef. of skewness  =  -0.105 
               coef. of kurtosis  =  2.98 
Filliben correlation coefficient  =  0.999 
******************************************************************

wp(modelo_glm2_1, ylim.all = 1)


modelo_glm2_2 <- gamlss(
              formula = Compl_Sang_Todos ~  pb(CC_FC_Ingreso) + pb(Lab_Hb) + Biomarc_pos + ECOTT_DisfVD  + pb(ClCr) + Pac_ACVglobal,
              family  = BI(mu.link = "logit"),
              data    = base_gam,
              trace   = FALSE
             )
summary(modelo_glm2_2)
******************************************************************
Family:  c("BI", "Binomial") 

Call:  gamlss(formula = Compl_Sang_Todos ~ pb(CC_FC_Ingreso) +      pb(Lab_Hb) + Biomarc_pos + ECOTT_DisfVD + pb(ClCr) +  
    Pac_ACVglobal, family = BI(mu.link = "logit"),      data = base_gam, trace = FALSE) 

Fitting method: RS() 

------------------------------------------------------------------
Mu link function:  logit
Mu Coefficients:
                  Estimate Std. Error t value Pr(>|t|)   
(Intercept)       -2.43275    0.93764   -2.59   0.0097 **
pb(CC_FC_Ingreso)  0.01038    0.00629    1.65   0.0995 . 
pb(Lab_Hb)        -0.15278    0.05989   -2.55   0.0110 * 
Biomarc_posSi      0.43668    0.31599    1.38   0.1674   
ECOTT_DisfVDSi     0.73800    0.30017    2.46   0.0142 * 
pb(ClCr)           0.00230    0.00274    0.84   0.4003   
Pac_ACVglobalSi   -0.01700    0.62932   -0.03   0.9785   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

------------------------------------------------------------------
NOTE: Additive smoothing terms exist in the formulas: 
 i) Std. Error for smoothers are for the linear effect only. 
ii) Std. Error for the linear terms maybe are not accurate. 
------------------------------------------------------------------
No. of observations in the fit:  684 
Degrees of Freedom for the fit:  9.14
      Residual Deg. of Freedom:  675 
                      at cycle:  5 
 
Global Deviance:     362 
            AIC:     381 
            SBC:     422 
******************************************************************
plot(modelo_glm2_2)
******************************************************************
     Summary of the Randomised Quantile Residuals
                           mean   =  -0.0498 
                       variance   =  0.976 
               coef. of skewness  =  -0.0386 
               coef. of kurtosis  =  2.83 
Filliben correlation coefficient  =  0.999 
******************************************************************

wp(modelo_glm2_2, ylim.all = 1)


modelo_glm2_3 <- gamlss(
              formula = Compl_Sang_Todos ~ pb(Lab_Hb) + Biomarc_pos + ECOTT_DisfVD  +  Pac_Edad_Corte + Pac_ACVglobal,
              family  = BI(mu.link = "logit"),
              data    = base_gam,
              trace   = FALSE
             )
summary(modelo_glm2_3)
******************************************************************
Family:  c("BI", "Binomial") 

Call:  gamlss(formula = Compl_Sang_Todos ~ pb(Lab_Hb) + Biomarc_pos +      ECOTT_DisfVD + Pac_Edad_Corte + Pac_ACVglobal,  
    family = BI(mu.link = "logit"), data = base_gam,      trace = FALSE) 

Fitting method: RS() 

------------------------------------------------------------------
Mu link function:  logit
Mu Coefficients:
                 Estimate Std. Error t value Pr(>|t|)   
(Intercept)       -1.2668     0.7251   -1.75   0.0811 . 
pb(Lab_Hb)        -0.1433     0.0596   -2.40   0.0165 * 
Biomarc_posSi      0.4524     0.3135    1.44   0.1496   
ECOTT_DisfVDSi     0.7814     0.2969    2.63   0.0087 **
Pac_Edad_CorteSi  -0.2025     0.3261   -0.62   0.5348   
Pac_ACVglobalSi   -0.0630     0.6268   -0.10   0.9200   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

------------------------------------------------------------------
NOTE: Additive smoothing terms exist in the formulas: 
 i) Std. Error for smoothers are for the linear effect only. 
ii) Std. Error for the linear terms maybe are not accurate. 
------------------------------------------------------------------
No. of observations in the fit:  684 
Degrees of Freedom for the fit:  8.06
      Residual Deg. of Freedom:  676 
                      at cycle:  4 
 
Global Deviance:     366 
            AIC:     382 
            SBC:     419 
******************************************************************
plot(modelo_glm2_3)
******************************************************************
     Summary of the Randomised Quantile Residuals
                           mean   =  -0.0134 
                       variance   =  1.04 
               coef. of skewness  =  0.075 
               coef. of kurtosis  =  2.83 
Filliben correlation coefficient  =  0.999 
******************************************************************

wp(modelo_glm2_3, ylim.all = 1)


###SELECCION DEL MEJOR MODELO###
GAIC(modelo_glm2_1, modelo_glm2_2,modelo_glm2_3)

#El mejor modelo es: modelo_glm2_3

#Cuando se incorpora en algún predictor de un modelo aditivo (GAM o GAMLSS) una función smooth, el coeficiente de regresión y su error estimado no se pueden interpretar de la forma convencional, ya que estos solo contemplan la aportación lineal, ignorando la no lineal. La mejor forma de interpretar el impacto de una función smooth no lineal es mediante:

#Gráficos de dependencia parcial, que muestran el impacto en las predicciones del modelo a medida que varía el valor de un predictor y se mantienen constantes los otros.

#getPEF(   #no se puede porque solamente hay 1 variable continua
#  modelo_glm2_3,
#  term      = "Lab_Hb",
#  parameter = "mu",
#  plot      = TRUE
#)

#Reajustar el modelo excluyendo el predictor de interés y evaluar el impacto que tiene sobre el modelo. drop1()
drop <- drop1(object = modelo_glm2_3, parallel = "multicore", ncpus = 4)
drop
Single term deletions for
mu

Model:
Compl_Sang_Todos ~ pb(Lab_Hb) + Biomarc_pos + ECOTT_DisfVD + 
    Pac_Edad_Corte + Pac_ACVglobal
                  Df AIC   LRT Pr(Chi)   
<none>               382                 
pb(Lab_Hb)     3.062 390 14.18  0.0028 **
Biomarc_pos    1.042 382  2.31  0.1358   
ECOTT_DisfVD   0.953 387  6.77  0.0086 **
Pac_Edad_Corte 0.925 380  0.14  0.6804   
Pac_ACVglobal  0.985 380 -0.04  1.0000   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Como conclusión vemos que probando con estos modelos aditivos no obtenemos resultados significativos para Plaquetas, Edad, ni Clearence de Creatinina.

ii) Modelo GAM con cross validation

#cross validation con método Leave one Out y GAM
#no se puede utilizar la libreria GAMLSS ya que tiene un error interno en el código al hacer CV con VR binomial
#dejo el script para futuros intentos
#modelo_glm2_cv <- gamlssCV(formula = Compl_Sang_Todos ~ Biomarc_pos + ECOTT_DisfVD  + pb(ClCr) + pb(Lab_Hb) + (Pac_Edad_Corte) + Pac_ACVglobal,
#                           family  = BI,
#                           data    = base_gam,
#                           K.fold = 10, parallel = "multicore", ncpus = 4,
#                           set.seed = 1)

#el CV con caret no permite seleccionar el tipo de smoothing de la variable, elige el smoothing que mejor se adapta a los datos de forma automática.

library(mgcv)
This is mgcv 1.8-40. For overview type 'help("mgcv-package")'.

Attaching package: ‘mgcv’

The following object is masked from ‘package:nnet’:

    multinom

The following object is masked from ‘package:arsenal’:

    negbin
library(caret)

base_gam$Compl_Sang_Todos <- as.factor(base_gam$Compl_Sang_Todos)
levels(base_gam$Compl_Sang_Todos) <- c("No", "Si")

set.seed(0)

LOOCV_m11 <- train(Compl_Sang_Todos ~ Biomarc_pos + ECOTT_DisfVD + Lab_Hb + Pac_Edad_Corte + Pac_ACVglobal, 
        data = base_gam,
        method = "gam",
        trControl = trainControl(method = "LOOCV", number = 1, classProbs = T, summaryFunction = twoClassSummary),
        tuneGrid = data.frame(method = "GCV.Cp", select = FALSE),
        family = "binomial", metric = "ROC"
)

summary(LOOCV_m11)

Family: binomial 
Link function: logit 

Formula:
.outcome ~ Biomarc_posSi + ECOTT_DisfVDSi + Pac_Edad_CorteSi + 
    Pac_ACVglobalSi + s(Lab_Hb)

Parametric coefficients:
                 Estimate Std. Error z value            Pr(>|z|)    
(Intercept)       -3.0369     0.2831  -10.73 <0.0000000000000002 ***
Biomarc_posSi      0.4569     0.3153    1.45              0.1473    
ECOTT_DisfVDSi     0.7824     0.2980    2.63              0.0087 ** 
Pac_Edad_CorteSi  -0.1952     0.3279   -0.60              0.5516    
Pac_ACVglobalSi   -0.0337     0.6294   -0.05              0.9573    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Approximate significance of smooth terms:
           edf Ref.df Chi.sq p-value  
s(Lab_Hb) 3.67   4.59     14   0.011 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

R-sq.(adj) =  0.036   Deviance explained = 7.08%
UBRE = -0.44163  Scale est. = 1         n = 684
#Calculo metricas con regresion logistica con smoothing de modelo con cross validation

LOOCV_m11$pred

roc_LOOCV_m11<- roc(base_gam$Compl_Sang_Todos ~ LOOCV_m11$pred[,4], auc=TRUE, ci=TRUE, plot=TRUE)
Setting levels: control = No, case = Si
Setting direction: controls < cases

plot(roc_LOOCV_m11)


Rta_predicha_LOOCV_m11 <- ifelse(fv(modelo_glm2)>0.3, 1, 0)

table(base_gam$Compl_Sang_Todos, Rta_predicha_LOOCV_m11)
    Rta_predicha_LOOCV_m11
       0   1
  No 621   6
  Si  53   4
Rta_predicha_LOOCV_m11 <- as.factor(Rta_predicha_LOOCV_m11)
levels(Rta_predicha_LOOCV_m11) <- c("No", "Si")
base_gam$Compl_Sang_Todos <- as.factor(base_gam$Compl_Sang_Todos)
levels(base_gam$Compl_Sang_Todos) <- c("No", "Si")
summary(base_gam$Compl_Sang_Todos)
 No  Si 
627  57 
table(base_gam$Compl_Sang_Todos, Rta_predicha_LOOCV_m11)
    Rta_predicha_LOOCV_m11
      No  Si
  No 621   6
  Si  53   4
#Calculo de metricas
library(caret)
LOOCV_m11_sensibilidad <- caret::sensitivity(base_gam$Compl_Sang_Todos , Rta_predicha_LOOCV_m11, positive="Si", negative = "No")
LOOCV_m11_especificidad <- caret::specificity(base_gam$Compl_Sang_Todos , Rta_predicha_LOOCV_m11, positive="Si", negative = "No")
LOOCV_m11_AUCROC <- roc_LOOCV_m11$auc
LOOCV_m11_accuracy <- mean(base_gam$Compl_Sang_Todos == Rta_predicha_LOOCV_m11)
LOOCV_m11_precision <- caret::precision(base_gam$Compl_Sang_Todos,Rta_predicha_LOOCV_m11)
LOOCV_m11_VPN <- caret::negPredValue(base_gam$Compl_Sang_Todos,Rta_predicha_LOOCV_m11)
LOOCV_m11_TFP <- 1-LOOCV_m11_especificidad

plot(LOOCV_m11$finalModel)

NA
NA

Resumiendo: Utilizamos la libreria GAMLSS y buscamos la mejor distribución entre las distintas binomiales para mi modelo. A posterior comparamos la regresión logística común con métodos de regresión que ajustan y modelan las variables cuantitativas que no respetan la linealidad de los logits, como es el caso de Plaquetas y Clearence de Creatinina.

El mejor modelo en base al AIC es el GLM2, es decir el modelo que utiliza P-splines Penalized Smoothing Splines. A modo exploratorio realizamos las métricas con este modelo, y luego realizamos con la libreria caret el mismo modelo utilizando cross-validation con k-fold = 10 (intentamos realizar cross validation con el paquete GAMLSS pero creemos que hay un problema con la librería al realizar cross validation de modelos binomiales) Con ese modelo con cross validation (modelo 11) realizamos las métricas y ahora seleccionaremos el mejor modelo en la próxima sección.

9) Métricas de perfomance de modelos GAM y logísticos


modelos <- c("Por analisis univariado", "Por Lasso", "Por Random Forest", "Por Lasso + RF + Univ", "GAM con CV")
Sensibilidad <- c(LOOCV_m6_sensibilidad, LOOCV_m7_sensibilidad, LOOCV_m8_sensibilidad, LOOCV_m9rf_sensibilidad,LOOCV_m11_sensibilidad)
Especificidad <- c(LOOCV_m6_especificidad, LOOCV_m7_especificidad, LOOCV_m8_especificidad, LOOCV_m9rf_especificidad, LOOCV_m11_especificidad)
AUCROC <- c(LOOCV_m6_AUCROC, LOOCV_m7_AUCROC, LOOCV_m8_AUCROC, LOOCV_m9rf_AUCROC,LOOCV_m11_AUCROC )
Accuracy <- c(LOOCV_m6_accuracy, LOOCV_m7_accuracy, LOOCV_m8_accuracy, LOOCV_m9rf_accuracy, LOOCV_m11_accuracy)
Precision <- c(LOOCV_m6_precision, LOOCV_m7_precision, LOOCV_m8_precision, LOOCV_m9rf_precision,LOOCV_m11_precision)
VPN <- c(LOOCV_m6_VPN, LOOCV_m7_VPN, LOOCV_m8_VPN, LOOCV_m9rf_VPN,LOOCV_m11_VPN)
TFP <- c(LOOCV_m6_TFP, LOOCV_m7_TFP, LOOCV_m8_TFP, LOOCV_m9rf_TFP,LOOCV_m11_TFP)


performance_modelos_LOOCV <- data.frame(modelos, Sensibilidad, Especificidad, AUCROC,
                                        Accuracy, Precision,  VPN, TFP)

plot_perf_model_LOOCV <- performance_modelos_LOOCV %>%
  pivot_longer(cols = -modelos,
               names_to = "Metricas",
               values_to = "Valor"
  )

# creamos el plot

ggplot()+
  geom_point(data=plot_perf_model_LOOCV, aes(x=Metricas, y=Valor, color=modelos), size=3)+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))


# la comparacion final la podemos hacer con las AUCROC y sus IC

IC_lower_95 <- c(roc_LOOCV_m6$ci[1], roc_LOOCV_m7$ci[1], roc_LOOCV_m8$ci[1], roc_LOOCV_m9rf$ci[1],roc_LOOCV_m11$ci[1] )
IC_upper_95 <- c(roc_LOOCV_m6$ci[3], roc_LOOCV_m7$ci[3], roc_LOOCV_m8$ci[3], roc_LOOCV_m9rf$ci[3],roc_LOOCV_m11$ci[3])

db_AUCROC_modelos <- as.data.frame(cbind(modelos, AUCROC, IC_lower_95, IC_upper_95))
db_AUCROC_modelos
# NO hay diferencia significativa, todos los IC 95% se superponen

#Seleccion de modelo por AIC 

mm6 <- extractAIC(LOOCV_m6$finalModel)#379
mm7 <- extractAIC(LOOCV_m7$finalModel) #367
mm8 <- extractAIC(LOOCV_m8$finalModel)#379
mm9 <- extractAIC(LOOCV_m9rf$finalModel)#381
mm11 <- extractAIC(LOOCV_m11$finalModel) #365
AIC_finales <- c(mm6, mm7, mm8, mm8, mm11)
AIC_finales
 [1]  11.00 378.08  10.00 379.66   7.00 389.40   7.00 389.40   8.67 381.93
#CONCLUSION: el modelo m11 es el que tiene mejor AUC, S y E y AIC y es el modelo elegido. 

CONCLUSION: el modelo m11 es el que tiene mejor AUC, S y E y AIC y es el modelo elegido.

10) Presentación de los datos finales

.No es posible graficar en términos de Odds Ratio los modelos con función smooth utilizados con libreria caret. Por lo tanto incluimos las tablas resumen y graficos que validan nuestro modelo propuesto. .Como conclusíón, en este registro de pacientes con tromboembolismo de pulmón, luego de realizar un modelo aditivo generalizado, se evidencia que las variables Hemoglobina, presencia de biomarcadores positivos, la presencia de disfunción ventricular derecha en el ecocardiograma, la edad > 75 años y el antecedente de ACV previo se asocian de forma significativa a la presencia de sangrado como complicación en la evolución intrahospitalaria y/o a 30 días de seguimiento ambulatorio.

#No es posible graficar en términos de Odds Ratio los modelos con función smooth utilizados con libreria caret.
#Por lo tanto incluimos las tablas resumen y graficos que validan nuestro modelo propuesto

#drop test para ver significancia de cada variable en modelo elegido
drop
Single term deletions for
mu

Model:
Compl_Sang_Todos ~ pb(Lab_Hb) + Biomarc_pos + ECOTT_DisfVD + 
    Pac_Edad_Corte + Pac_ACVglobal
                  Df AIC   LRT Pr(Chi)   
<none>               382                 
pb(Lab_Hb)     3.062 390 14.18  0.0028 **
Biomarc_pos    1.042 382  2.31  0.1358   
ECOTT_DisfVD   0.953 387  6.77  0.0086 **
Pac_Edad_Corte 0.925 380  0.14  0.6804   
Pac_ACVglobal  0.985 380 -0.04  1.0000   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#grafico con variable Hb suavizada para el modelo elegido
plot(LOOCV_m11$finalModel)

#gráfico de residuos tipo worms para modelo GAM elegido
library(gamlss)
wp(modelo_glm2_3, ylim.all = 1)

#curva ROC del modelo elegido
library(pROC)
pROC_obj <- pROC::roc(base_gam$Compl_Sang_Todos,LOOCV_m11$pred[,4],
            smoothed = TRUE,
            # arguments for ci
            ci=TRUE, ci.alpha=0.9, stratified=FALSE,
            # arguments for plot
            plot=TRUE, auc.polygon=TRUE, max.auc.polygon=TRUE, grid=TRUE,
            print.auc=TRUE, show.thres=TRUE)
Setting levels: control = No, case = Si
Setting direction: controls < cases
sens.ci <- ci.se(pROC_obj)

  |                                                                                                                                          
  |                                                                                                                                    |   0%
  |                                                                                                                                          
  |=                                                                                                                                   |   0%
  |                                                                                                                                          
  |=                                                                                                                                   |   1%
  |                                                                                                                                          
  |==                                                                                                                                  |   1%
  |                                                                                                                                          
  |==                                                                                                                                  |   2%
  |                                                                                                                                          
  |===                                                                                                                                 |   2%
  |                                                                                                                                          
  |===                                                                                                                                 |   3%
  |                                                                                                                                          
  |====                                                                                                                                |   3%
  |                                                                                                                                          
  |=====                                                                                                                               |   3%
  |                                                                                                                                          
  |=====                                                                                                                               |   4%
  |                                                                                                                                          
  |======                                                                                                                              |   4%
  |                                                                                                                                          
  |======                                                                                                                              |   5%
  |                                                                                                                                          
  |=======                                                                                                                             |   5%
  |                                                                                                                                          
  |=======                                                                                                                             |   6%
  |                                                                                                                                          
  |========                                                                                                                            |   6%
  |                                                                                                                                          
  |=========                                                                                                                           |   6%
  |                                                                                                                                          
  |=========                                                                                                                           |   7%
  |                                                                                                                                          
  |==========                                                                                                                          |   7%
  |                                                                                                                                          
  |==========                                                                                                                          |   8%
  |                                                                                                                                          
  |===========                                                                                                                         |   8%
  |                                                                                                                                          
  |===========                                                                                                                         |   9%
  |                                                                                                                                          
  |============                                                                                                                        |   9%
  |                                                                                                                                          
  |=============                                                                                                                       |  10%
  |                                                                                                                                          
  |==============                                                                                                                      |  10%
  |                                                                                                                                          
  |==============                                                                                                                      |  11%
  |                                                                                                                                          
  |===============                                                                                                                     |  11%
  |                                                                                                                                          
  |===============                                                                                                                     |  12%
  |                                                                                                                                          
  |================                                                                                                                    |  12%
  |                                                                                                                                          
  |=================                                                                                                                   |  13%
  |                                                                                                                                          
  |==================                                                                                                                  |  13%
  |                                                                                                                                          
  |==================                                                                                                                  |  14%
  |                                                                                                                                          
  |===================                                                                                                                 |  14%
  |                                                                                                                                          
  |===================                                                                                                                 |  15%
  |                                                                                                                                          
  |====================                                                                                                                |  15%
  |                                                                                                                                          
  |====================                                                                                                                |  16%
  |                                                                                                                                          
  |=====================                                                                                                               |  16%
  |                                                                                                                                          
  |======================                                                                                                              |  16%
  |                                                                                                                                          
  |======================                                                                                                              |  17%
  |                                                                                                                                          
  |=======================                                                                                                             |  17%
  |                                                                                                                                          
  |=======================                                                                                                             |  18%
  |                                                                                                                                          
  |========================                                                                                                            |  18%
  |                                                                                                                                          
  |========================                                                                                                            |  19%
  |                                                                                                                                          
  |=========================                                                                                                           |  19%
  |                                                                                                                                          
  |==========================                                                                                                          |  19%
  |                                                                                                                                          
  |==========================                                                                                                          |  20%
  |                                                                                                                                          
  |===========================                                                                                                         |  20%
  |                                                                                                                                          
  |===========================                                                                                                         |  21%
  |                                                                                                                                          
  |============================                                                                                                        |  21%
  |                                                                                                                                          
  |============================                                                                                                        |  22%
  |                                                                                                                                          
  |=============================                                                                                                       |  22%
  |                                                                                                                                          
  |==============================                                                                                                      |  22%
  |                                                                                                                                          
  |==============================                                                                                                      |  23%
  |                                                                                                                                          
  |===============================                                                                                                     |  23%
  |                                                                                                                                          
  |===============================                                                                                                     |  24%
  |                                                                                                                                          
  |================================                                                                                                    |  24%
  |                                                                                                                                          
  |================================                                                                                                    |  25%
  |                                                                                                                                          
  |=================================                                                                                                   |  25%
  |                                                                                                                                          
  |==================================                                                                                                  |  25%
  |                                                                                                                                          
  |==================================                                                                                                  |  26%
  |                                                                                                                                          
  |===================================                                                                                                 |  26%
  |                                                                                                                                          
  |===================================                                                                                                 |  27%
  |                                                                                                                                          
  |====================================                                                                                                |  27%
  |                                                                                                                                          
  |====================================                                                                                                |  28%
  |                                                                                                                                          
  |=====================================                                                                                               |  28%
  |                                                                                                                                          
  |======================================                                                                                              |  28%
  |                                                                                                                                          
  |======================================                                                                                              |  29%
  |                                                                                                                                          
  |=======================================                                                                                             |  29%
  |                                                                                                                                          
  |=======================================                                                                                             |  30%
  |                                                                                                                                          
  |========================================                                                                                            |  30%
  |                                                                                                                                          
  |========================================                                                                                            |  31%
  |                                                                                                                                          
  |=========================================                                                                                           |  31%
  |                                                                                                                                          
  |==========================================                                                                                          |  31%
  |                                                                                                                                          
  |==========================================                                                                                          |  32%
  |                                                                                                                                          
  |===========================================                                                                                         |  32%
  |                                                                                                                                          
  |===========================================                                                                                         |  33%
  |                                                                                                                                          
  |============================================                                                                                        |  33%
  |                                                                                                                                          
  |============================================                                                                                        |  34%
  |                                                                                                                                          
  |=============================================                                                                                       |  34%
  |                                                                                                                                          
  |==============================================                                                                                      |  34%
  |                                                                                                                                          
  |==============================================                                                                                      |  35%
  |                                                                                                                                          
  |===============================================                                                                                     |  35%
  |                                                                                                                                          
  |===============================================                                                                                     |  36%
  |                                                                                                                                          
  |================================================                                                                                    |  36%
  |                                                                                                                                          
  |================================================                                                                                    |  37%
  |                                                                                                                                          
  |=================================================                                                                                   |  37%
  |                                                                                                                                          
  |==================================================                                                                                  |  38%
  |                                                                                                                                          
  |===================================================                                                                                 |  38%
  |                                                                                                                                          
  |===================================================                                                                                 |  39%
  |                                                                                                                                          
  |====================================================                                                                                |  39%
  |                                                                                                                                          
  |====================================================                                                                                |  40%
  |                                                                                                                                          
  |=====================================================                                                                               |  40%
  |                                                                                                                                          
  |======================================================                                                                              |  41%
  |                                                                                                                                          
  |=======================================================                                                                             |  41%
  |                                                                                                                                          
  |=======================================================                                                                             |  42%
  |                                                                                                                                          
  |========================================================                                                                            |  42%
  |                                                                                                                                          
  |========================================================                                                                            |  43%
  |                                                                                                                                          
  |=========================================================                                                                           |  43%
  |                                                                                                                                          
  |=========================================================                                                                           |  44%
  |                                                                                                                                          
  |==========================================================                                                                          |  44%
  |                                                                                                                                          
  |===========================================================                                                                         |  44%
  |                                                                                                                                          
  |===========================================================                                                                         |  45%
  |                                                                                                                                          
  |============================================================                                                                        |  45%
  |                                                                                                                                          
  |============================================================                                                                        |  46%
  |                                                                                                                                          
  |=============================================================                                                                       |  46%
  |                                                                                                                                          
  |=============================================================                                                                       |  47%
  |                                                                                                                                          
  |==============================================================                                                                      |  47%
  |                                                                                                                                          
  |===============================================================                                                                     |  47%
  |                                                                                                                                          
  |===============================================================                                                                     |  48%
  |                                                                                                                                          
  |================================================================                                                                    |  48%
  |                                                                                                                                          
  |================================================================                                                                    |  49%
  |                                                                                                                                          
  |=================================================================                                                                   |  49%
  |                                                                                                                                          
  |=================================================================                                                                   |  50%
  |                                                                                                                                          
  |==================================================================                                                                  |  50%
  |                                                                                                                                          
  |===================================================================                                                                 |  50%
  |                                                                                                                                          
  |===================================================================                                                                 |  51%
  |                                                                                                                                          
  |====================================================================                                                                |  51%
  |                                                                                                                                          
  |====================================================================                                                                |  52%
  |                                                                                                                                          
  |=====================================================================                                                               |  52%
  |                                                                                                                                          
  |=====================================================================                                                               |  53%
  |                                                                                                                                          
  |======================================================================                                                              |  53%
  |                                                                                                                                          
  |=======================================================================                                                             |  53%
  |                                                                                                                                          
  |=======================================================================                                                             |  54%
  |                                                                                                                                          
  |========================================================================                                                            |  54%
  |                                                                                                                                          
  |========================================================================                                                            |  55%
  |                                                                                                                                          
  |=========================================================================                                                           |  55%
  |                                                                                                                                          
  |=========================================================================                                                           |  56%
  |                                                                                                                                          
  |==========================================================================                                                          |  56%
  |                                                                                                                                          
  |===========================================================================                                                         |  56%
  |                                                                                                                                          
  |===========================================================================                                                         |  57%
  |                                                                                                                                          
  |============================================================================                                                        |  57%
  |                                                                                                                                          
  |============================================================================                                                        |  58%
  |                                                                                                                                          
  |=============================================================================                                                       |  58%
  |                                                                                                                                          
  |=============================================================================                                                       |  59%
  |                                                                                                                                          
  |==============================================================================                                                      |  59%
  |                                                                                                                                          
  |===============================================================================                                                     |  60%
  |                                                                                                                                          
  |================================================================================                                                    |  60%
  |                                                                                                                                          
  |================================================================================                                                    |  61%
  |                                                                                                                                          
  |=================================================================================                                                   |  61%
  |                                                                                                                                          
  |=================================================================================                                                   |  62%
  |                                                                                                                                          
  |==================================================================================                                                  |  62%
  |                                                                                                                                          
  |===================================================================================                                                 |  63%
  |                                                                                                                                          
  |====================================================================================                                                |  63%
  |                                                                                                                                          
  |====================================================================================                                                |  64%
  |                                                                                                                                          
  |=====================================================================================                                               |  64%
  |                                                                                                                                          
  |=====================================================================================                                               |  65%
  |                                                                                                                                          
  |======================================================================================                                              |  65%
  |                                                                                                                                          
  |======================================================================================                                              |  66%
  |                                                                                                                                          
  |=======================================================================================                                             |  66%
  |                                                                                                                                          
  |========================================================================================                                            |  66%
  |                                                                                                                                          
  |========================================================================================                                            |  67%
  |                                                                                                                                          
  |=========================================================================================                                           |  67%
  |                                                                                                                                          
  |=========================================================================================                                           |  68%
  |                                                                                                                                          
  |==========================================================================================                                          |  68%
  |                                                                                                                                          
  |==========================================================================================                                          |  69%
  |                                                                                                                                          
  |===========================================================================================                                         |  69%
  |                                                                                                                                          
  |============================================================================================                                        |  69%
  |                                                                                                                                          
  |============================================================================================                                        |  70%
  |                                                                                                                                          
  |=============================================================================================                                       |  70%
  |                                                                                                                                          
  |=============================================================================================                                       |  71%
  |                                                                                                                                          
  |==============================================================================================                                      |  71%
  |                                                                                                                                          
  |==============================================================================================                                      |  72%
  |                                                                                                                                          
  |===============================================================================================                                     |  72%
  |                                                                                                                                          
  |================================================================================================                                    |  72%
  |                                                                                                                                          
  |================================================================================================                                    |  73%
  |                                                                                                                                          
  |=================================================================================================                                   |  73%
  |                                                                                                                                          
  |=================================================================================================                                   |  74%
  |                                                                                                                                          
  |==================================================================================================                                  |  74%
  |                                                                                                                                          
  |==================================================================================================                                  |  75%
  |                                                                                                                                          
  |===================================================================================================                                 |  75%
  |                                                                                                                                          
  |====================================================================================================                                |  75%
  |                                                                                                                                          
  |====================================================================================================                                |  76%
  |                                                                                                                                          
  |=====================================================================================================                               |  76%
  |                                                                                                                                          
  |=====================================================================================================                               |  77%
  |                                                                                                                                          
  |======================================================================================================                              |  77%
  |                                                                                                                                          
  |======================================================================================================                              |  78%
  |                                                                                                                                          
  |=======================================================================================================                             |  78%
  |                                                                                                                                          
  |========================================================================================================                            |  78%
  |                                                                                                                                          
  |========================================================================================================                            |  79%
  |                                                                                                                                          
  |=========================================================================================================                           |  79%
  |                                                                                                                                          
  |=========================================================================================================                           |  80%
  |                                                                                                                                          
  |==========================================================================================================                          |  80%
  |                                                                                                                                          
  |==========================================================================================================                          |  81%
  |                                                                                                                                          
  |===========================================================================================================                         |  81%
  |                                                                                                                                          
  |============================================================================================================                        |  81%
  |                                                                                                                                          
  |============================================================================================================                        |  82%
  |                                                                                                                                          
  |=============================================================================================================                       |  82%
  |                                                                                                                                          
  |=============================================================================================================                       |  83%
  |                                                                                                                                          
  |==============================================================================================================                      |  83%
  |                                                                                                                                          
  |==============================================================================================================                      |  84%
  |                                                                                                                                          
  |===============================================================================================================                     |  84%
  |                                                                                                                                          
  |================================================================================================================                    |  84%
  |                                                                                                                                          
  |================================================================================================================                    |  85%
  |                                                                                                                                          
  |=================================================================================================================                   |  85%
  |                                                                                                                                          
  |=================================================================================================================                   |  86%
  |                                                                                                                                          
  |==================================================================================================================                  |  86%
  |                                                                                                                                          
  |==================================================================================================================                  |  87%
  |                                                                                                                                          
  |===================================================================================================================                 |  87%
  |                                                                                                                                          
  |====================================================================================================================                |  88%
  |                                                                                                                                          
  |=====================================================================================================================               |  88%
  |                                                                                                                                          
  |=====================================================================================================================               |  89%
  |                                                                                                                                          
  |======================================================================================================================              |  89%
  |                                                                                                                                          
  |======================================================================================================================              |  90%
  |                                                                                                                                          
  |=======================================================================================================================             |  90%
  |                                                                                                                                          
  |========================================================================================================================            |  91%
  |                                                                                                                                          
  |=========================================================================================================================           |  91%
  |                                                                                                                                          
  |=========================================================================================================================           |  92%
  |                                                                                                                                          
  |==========================================================================================================================          |  92%
  |                                                                                                                                          
  |==========================================================================================================================          |  93%
  |                                                                                                                                          
  |===========================================================================================================================         |  93%
  |                                                                                                                                          
  |===========================================================================================================================         |  94%
  |                                                                                                                                          
  |============================================================================================================================        |  94%
  |                                                                                                                                          
  |=============================================================================================================================       |  94%
  |                                                                                                                                          
  |=============================================================================================================================       |  95%
  |                                                                                                                                          
  |==============================================================================================================================      |  95%
  |                                                                                                                                          
  |==============================================================================================================================      |  96%
  |                                                                                                                                          
  |===============================================================================================================================     |  96%
  |                                                                                                                                          
  |===============================================================================================================================     |  97%
  |                                                                                                                                          
  |================================================================================================================================    |  97%
  |                                                                                                                                          
  |=================================================================================================================================   |  97%
  |                                                                                                                                          
  |=================================================================================================================================   |  98%
  |                                                                                                                                          
  |==================================================================================================================================  |  98%
  |                                                                                                                                          
  |==================================================================================================================================  |  99%
  |                                                                                                                                          
  |=================================================================================================================================== |  99%
  |                                                                                                                                          
  |=================================================================================================================================== | 100%
  |                                                                                                                                          
  |====================================================================================================================================| 100%
plot(sens.ci, type="shape", col="lightblue")
Warning: Low definition shape.
plot(sens.ci, type="bars")

LS0tCnRpdGxlOiAiUHJlZGljdG9yZXMgZGUgc2FuZ3JhZG8gZW4gdHJvbWJvZW1ib2xpc21vIGRlIHB1bG3Ds24iCmF1dGhvcjogIk1haWNvIEJlcm5hbCwgR29uemFsbyBSYWzDs24sIFZpY3RvcmlhIFZlcm5lbmdvIExlemljYSIKZGF0ZTogIjIxLzYvMjAyMSIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgdGhlbWU6IGx1bWVuCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKc3VidGl0bGU6IFRyYWJham8gRmluYWwgQ0VFQ1MgLSBUYWxsZXIKLS0tCmBgYHs9aHRtbH0KPHN0eWxlPgpib2R5IHsKdGV4dC1hbGlnbjoganVzdGlmeX0KPC9zdHlsZT4KYGBgCiMgKkJBU0UgREUgREFUT1MqCiMjIDEpICoqUHJlcGFyYWNpw7NuIGRlIGxvcyBkYXRvcyoqIChJKQojIyMgYSkgTGVjdHVyYSBkZWwgZGF0YXNldCB5IHN1IGVzdHJ1Y3R1cmEKYGBge3IgaW5jbHVkZT1GQUxTRX0KI1NlIHN1Z2llcmUgZGVzY2FyZ2EgZGUgb2JqZXRvcyBlbiBtZW1vcmlhLgojcm0obGlzdCA9IGxzKCkpCgojTGlicmVyw61hcyBhIGNhcmdhcgpsaWJyYXJ5KHNqUGxvdCkKbGlicmFyeShzam1pc2MpCmxpYnJhcnkocHVycnIpCmxpYnJhcnkoc2psYWJlbGxlZCkKbGlicmFyeSh0aWR5bW9kZWxzKQpsaWJyYXJ5KGFyc2VuYWwpCmxpYnJhcnkoYm9vdCkKbGlicmFyeShicm9vbSkKbGlicmFyeShjYXIpCmxpYnJhcnkoY2FyZXQpCmxpYnJhcnkoY29ycnBsb3QpCmxpYnJhcnkoY29ycnIpCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShkcGx5cikKbGlicmFyeShlbW1lYW5zKQpsaWJyYXJ5KGVwaURpc3BsYXkpCmxpYnJhcnkoZXBpUikKbGlicmFyeShmQmFzaWNzKQpsaWJyYXJ5KGZvcmVhY2gpCmxpYnJhcnkoZm9yZWlnbikKbGlicmFyeShHR2FsbHkpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkoZ2xtbVRNQikKbGlicmFyeShnbG1uZXQpCmxpYnJhcnkoZ3JpZEV4dHJhKSAKbGlicmFyeShJbmZvcm1hdGlvblZhbHVlKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkobGF0dGljZSkKbGlicmFyeShsbWVyVGVzdCkKbGlicmFyeShtaWNlKQpsaWJyYXJ5KG5hbmlhcikKbGlicmFyeShubG1lKQpsaWJyYXJ5KHBST0MpCmxpYnJhcnkocXVlc3Rpb25yKQpsaWJyYXJ5KHJhbmRvbUZvcmVzdCkKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkoUmVzb3VyY2VTZWxlY3Rpb24pCmxpYnJhcnkocmxpc3QpCmxpYnJhcnkocm1hcmtkb3duKQpsaWJyYXJ5KFJtaXNjKQpsaWJyYXJ5KHRhYmxlb25lKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShWSU0pCmxpYnJhcnkodmlzZGF0KQoKb3B0aW9ucyhzY2lwZW4gPSA5OTkpCmBgYAoKYGBgYHtyfQojRXhwb3J0YW1vcyBsYSBiYXNlCmJhc2UgPC0gcmVhZF9leGNlbCgiYmFzZV9jb3JyZWdpZGFfZmluYWwueGxzeCIpCgojY3JlYW1vcyB1bmEgdmFyaWFibGUgY29uIHRvZG9zIGxvcyBub21icmVzIHBhcmEgZnV0dXJhcyByZWZlcmVuY2lhczoKbm9tYnJlcyA8LSBjKCJQYWNfU2V4IiwgIlBhY19FZGFkIiwgIlBhY19Db2JlcnR1cmEiLCAiUGFjX0hUQSIsICJQYWNfREJUIiwgIlBhY19UQlEiLCAiUGFjX0RMUCIsICJQYWNfSUNDIiwgIlBhY19GQSIsICJQYWNfRVRWcHJlIiwgIlBhY19URVBwcmUiLCAiUGFjX1RFUF9wcmV2aW9fbWVub3JfM19tZXNlcyIsICJQYWNfRGVhbWIiLCAiUGFjX1JlcG9zbyIsICJQYWNfRVBPQyIsICJQYWNfQUNWZ2xvYmFsIiwgIlBhY19IZW1vcnJhZ2lhX1ByZXZpYV9NYXlvcl9Ub2RhcyIsICJQYWNfSGVtb3JyYWdpYV9QcmV2aWFfTWF5b3JfUmVjaWVudGUiLCAiUGFjX0VuZkF1dG8iLCAiUGFjX0lSQ2dsb2JhbCIsICJQYWNfU21lUHJvY29hZyIsICJQRVNJX0NhbmNlciIsICJQYWNfQUNPX1ByZXZpYSIsICJJTUMiLCAiTW90SW50IiwgIlBFU0lfRGV0X1NlbnMiLCAiQ0NfSG9yYXNfU3hfQWRtaXNpb24iLCAiQ0NfRkNfSW5ncmVzbyIsICJQRVNJX1RhcXVpY2FyZGlhIiwgIkNDX1RBU19JbmdyZXNvIiwgIlBFU0lfSGlwb3RlbnNpb24iLCAiQ0NfRlJfSW5ncmVzbyIsICJQRVNJX1RhcXVpcG5lYSIsICJQRVNJX0hpcG90ZXJtaWEiLCAiQ0NfU2FPX0luZ3Jlc28iLCAiQ0NfU2FPOTAiLCAiV2VsbHMiLCAiUEVTSWNhbGMiLCAiUEVTSV9jbGFzaWYiLCAiUEVTSXNDYWxjIiwgIlBFU0lzX0NsYXNpZiIsICJQYWNfQ3hfVG90YWwiLCAiTGFiX0h0byIsICJMYWJfSGIiLCAiTGFiX0dCIiwgIkxhYl9DciIsICJMYWJfUGxhcSIsICJCaW9tYXJjX3BvcyIsICJFQ09UVF9GU1ZJIiwgIkVDT1RUX1RBUFNFIiwgIkVDT1RUX1BTQVAiLCAiRUNPVFRfRGlzZlZEIiwgIkFsdGFfQ2FyZ2FfVHJvbWJvX1RBQyIsICJJbnRfT19BbHRvX1JpZXNnb19DYWxjIiwgIkVzdFJpZXNnbyIsICJTZXJ2aWNpb0NhcmdvIiwgIlJJRVRFX0NhbGMiLCAiUklFVEVfR3J1cG8iLCAiSEFTQkxFRCIsICJBQ09pbnQiLCAiRlZDSSIsICJUdG9fUmVwZXJmIiwgIlRMX2N1YWwiLCAiQ29tcGxfU2FuZ19Ub2RvcyIsICJDb21wbF9Tb3BvcnRlSERfTk8iLCAiQWx0YV9UdG9fVGlwb3NBQ08iLCAiRE9BQ19zaV92c19ubyIpCgojb3JkZW5hbW9zIHN1IGVzdHJ1Y3R1cmEKYmFzZVtzYXBwbHkoYmFzZSwgaXMuY2hhcmFjdGVyKV0gPC0gbGFwcGx5KGJhc2Vbc2FwcGx5KGJhc2UsIGlzLmNoYXJhY3RlcildLCBhcy5mYWN0b3IpCgpgYGAKCj4gLSAgRGUgdW5hIG11ZXN0cmEgb3JpZ2luYWwgZGUgYHIgZGltKGJhc2UpWzFdYCBwYWNpZW50ZXMgaW50ZXJuYWRvcyBwb3IgdGVuZXIgY29tcGxpY2FjaW9uZXMgdHJvbWJvZW1iw7NsaWNhcywgc2UgcmVnaXN0cmFyb24sIGVuIHByaW1lcmEgaW5zdGFuY2lhLCAzMjIgdmFyaWFibGVzLjxicj4KRXNhcyB2YXJpYWJsZXMgcmVmZXLDrWFuIGE6IGNhcmFjdGVyw61zdGljYXMgc29jaWFsZXMgeSBkZW1vZ3LDoWZpY2FzOyBhc3BlY3RvcyBkZSBzdXMgaGlzdG9yaWFzIGNsw61uaWNhczsgY2FyYWN0ZXLDrXN0aWNhcyBjbMOtbmljYXMgcmVnaXN0cmFkYXMgZW4gZWwgbW9tZW50byBkZSBpbmdyZXNvIG5vc29jb21pYWw7IHJlc3VsdGFkb3MgZGUgZXN0dWRpb3MgY29tcGxlbWVudGFyaW9zIHJlYWxpemFkb3MgZHVyYW50ZSBlbCBwZXLDrW9kbyBkZSBpbnRlcm5hY2nDs24gLS1xdWUgaW5jbHV5ZW4gaW3DoWdlbmVzIHkgYmlvaW5kaWNhZG9yZXMgZGUgbGFib3JhdG9yaW8tOyBpbmRpY2Fkb3JlcyBkZSBlc3RhZG8gZW4gZWwgbW9tZW50byBkZWwgYWx0YTsgcHJlc2NyaXBjaW9uZXMgcGFyYSB0cmF0YW1pZW50byBwcmV2ZW50aXZvOyBpbmRpY2Fkb3JlcyBkZSBzZWd1aW1pZW50byBhIGxvcyAzMCBkw61hcyAoKsK/cGF1dGFzIGRlIGFsYXJtYT8qKS4KT3RyYXMgdmFyaWFibGVzIGluY2x1aWRhcyBjb25zaXN0ZW4gZW4gdW4gY29uanVudG8gZGUgw61uZGljZXMgY29tcHVlc3RvcyByZWxhY2lvbmFkb3MgY29uIGxhIGVzdGltYWNpw7NuIGRlIHJpZXNnb3MgZGl2ZXJzb3M6IFJlZ2lzdHJvIEluZm9ybWF0aXphZG8gZGUgUGFjaWVudGVzIGNvbiBFbmZlcm1lZGFkIFRyb21ibyBFbWLDs2xpY2EgKFJJRVRFKTsgw41uZGljZSBkZSBXZWxscyBwYXJhIFRyb21ib3NpcyBWZW5vc2EgUHJvZnVuZGEgKFRWUCAtIFdlbGxzKTsgw41uZGljZSBkZSBTZXZlcmlkYWQgcGFyYSBlbCBFbWJvbGlzbW8gUHVsbW9uYXIgKFB1bG1vbmFyeSBFbWJvbGlzbSBTZXZlcml0eSBJbmRleCwgUEVTSSk7IHkgdW5hIGVzY2FsYSBkZSBFc3RyYXRpZmljYWNpw7NuIHByb27Ds3N0aWNhIHkgdHJhdGFtaWVudG8gZGUgbGEgdHJvbWJvZW1ib2xpYSBwdWxtb25hciBlbiBmYXNlIGFndWRhIChFc3RSaWVzZ28pLiBTZSBjb25zZXJ2YW4gZXN0b3Mgw61uZGljZXMgcGFyYSBjb21wYXJhcmxvcyBjb24gbGFzIGVzdGltYWNpb25lcyBtdWx0aXZhcmlhZGFzIHF1ZSBwdWVkYW4gb2J0ZW5lcnNlIGNvbiBsb3MgZGF0b3MgZnVuZGFtZW50YWxlcy48YnI+CkRlIGVsbGFzIHNlIHNlbGVjY2lvbmFyb24gYHIgZGltKGJhc2UpWzJdYCB2YXJpYWJsZXMgcXVlIHByZXNlbnRhbiBlbCBjb250ZW5pZG8gY29uY2VwdHVhbCBmdW5kYW1lbnRhbCBwYXJhIGVsIGFqdXN0ZSBkZSB1biBtb2RlbG8gZXhwbGljYXRpdm8gY2VudHJhZG8gZW4gZWwgYW7DoWxpc2lzIG11bHRpdmFyaWFudGUgZGUgbGFzIHByb2JhYmlsaWRhZGVzIGRlIHN1ZnJpciBlcGlzb2Rpb3MgZGUgc2FuZ3JhZG8uIExhcyBgciAzMjItZGltKGJhc2UpWzJdYCB2YXJpYWJsZXMgZXhjbHXDrWRhcyBwcmVzZW50YWJhbiBhcnRpY3VsYWNpb25lcyBsw7NnaWNhcyBvIGFyaXRtw6l0aWNhcyBkZSBhbGd1bmFzIGRlIGxhcyBgciBkaW0oYmFzZSlbMl1gIHZhcmlhYmxlcyBjb25zZXJ2YWRhcywgZGUgbW9kbyBxdWUgc2Ugb3B0w7MgcG9yIGNvbmNlbnRyYXIgZWwgYW7DoWxpc2lzIGVuIGxhcyBkaW1lbnNpb25lcyBlbXDDrXJpY2FzIGZ1bmRhbWVudGFsZXMuPGJyPgpQb3Igw7psdGltbywgc2UgaW5jbHV5ZSBsYSB2YXJpYWJsZSBDb21wbF9TYW5nX1RvZG9zIMO6bHRpbWEgY29tbyB2YXJpYWJsZSBxdWUgZXhwcmVzYSBlbCBkZXNlbmxhY2UgZnVuZGFtZW50YWwsIHkgcXVlIHNlIGFkb3B0YSBjb21vIHZhcmlhYmxlIHJlc3B1ZXN0YSBwYXJhIGxvcyBtb2RlbG9zIGRlIHJlZ3Jlc2nDs246IHNpIGVsIHBhY2llbnRlIHN1ZnJpw7MgYWxnw7puIHRpcG8gZGUgc2FuZ3JhZG8gY29tbyBjb21wbGljYWNpw7NuIGRlbCB0cmF0YW1pZW50byBhbnRpIGNvYWd1bGFudGUgeS9vIGRlIHJlcGVyZnVzacOzbiByZWFsaXphZG8uIEluY2x1eWUgdG9kb3MgbG9zIHNhbmdyYWRvcyBkZSBsYSBjbGFzaWZpY2FjacOzbiBCQVJDIG1heW9yIG8gaWd1YWwgYSBJSTogc2FuZ3JhZG9zIHF1ZSByZXF1aWVyZW4gYXRlbmNpw7NuIG3DqWRpY2EgbyBtw6FzPGJyPgoKIyMgMikgKipBbsOhbGlzaXMgZGUgZGF0b3MgZmFsdGFudGVzKiogKEkpCiMjIyBhKSBWYWxvcmVzIMO6bmljb3MgeSBmYWx0YW50ZXMKCmBgYHtyfQpwcm9wX21pc3MoYmFzZSkqMTAwCnByb3BfbWlzcyhiYXNlJENvbXBsX1NhbmdfVG9kb3MpCnZpc19kYXQoYmFzZSkgKyBnZ3RpdGxlKCJHcsOhZmljbyAxIC0gVmFsb3JlcyBwZXJkaWRvcyBzZWfDum4gdGlwb3MgZGUgdmFyaWFibGVzIChuID0gNjg0KSIpCiMgdmlzX21pc3MoYmFzZSkgKyBnZ3RpdGxlKCJHcsOhZmljbyAyIC0gUG9yY2VudGFqZSBkZSB2YWxvcmVzIHBlcmRpZG9zIG8gbm8gcmVnaXN0cmFkb3MgcG9yIHZhcmlhYmxlcyAobiA9IDY4NCkiKSAjIyMgwqFBVEVOQ0nDk04hICMjIyBTYWNvIGVzdGUgZ3LDoWZpY28gcG9ycXVlIGVzdMOhIG3DoXMgYWJham8gY29tbyBHcsOhZmljbyA1LgojIFJldmlzYXIgc2kgZXN0b3kgbm9tYnJhbmRvIGJpZW4gbGFzIHZhcmlhYmxlcyBkZSBhZ3J1cGFtaWVudG8uCiMgTG9zIGdyw6FmaWNvcyA0LCA1IHkgNiBwZXJtaXRlbiB2ZXIgbGEgZGlzdHJpYnVjacOzbiBkZSB2YWxvcmVzIHBlcmRpZG9zIGVuIHBvcmNlbnRhamVzIGRlIGNhZGEgdW5hIGRlIGxhcyB2YXJpYWJsZXMuIEVzdG9zIGdyw6FmaWNvcyBzb24gbcOhcyBvcmRlbmFkb3JlcyB5IGhhc3RhIHBlcm1pdGlyw61hbiBhcHJlY2lhciBjdcOhbGVzIHNvbiBsYXMgdmFyaWFibGVzIGNvbiBtw6FzIHZhbG9yZXMgcGVyZGlkb3MuIExvcyBnZ19taXNzX3ZhciBubyBwZXJtaXRlbiBjb21wYXJhciBsYXMgZGlzdHJpYnVjaW9uZXMgcG9ycXVlIGxhcyBjYW50aWRhZGVzIGRlIFVBIGNvbiBzYW5ncmFkb3Mgc29uIHNpZW1wcmUgbXVjaG8gbWVub3Jlcy4KIyBnZ19taXNzX3Zhcl9jdW1zdW0oeCA9IGJhc2UpICsgZ2d0aXRsZSgiR3LDoWZpY28gMyAtIFZhbG9yZXMgcGVyZGlkb3MgYWN1bXVsYWRvcyBwb3IgdmFyaWFibGVzIChuID0gNjg0KSIpCmdnX21pc3NfZmN0KHggPSBiYXNlLCBmY3QgPSBDb21wbF9TYW5nX1RvZG9zKSArIGdndGl0bGUoIkdyw6FmaWNvIDIgLSBQb3JjZW50YWplcyBkZSB2YWxvcmVzIHBlcmRpZG9zIHNlZ8O6biBkZXNlbmxhY2UgZGUgdG9kb3MgbG9zIHRpcG9zIGRlIHNhbmdyYWRvIChuID0gNjg0KSIpCgojIMKhQVRFTkNJw5NOISAjIE5vIHNlIGluY2x1eWVuIGxvcyBncsOhZmljb3MgcXVlIHNpZ3VlbiBwb3JxdWUgY29tbyBsYXMgVUEgY29uIHNhbmdyYWRvIHNvbiBzaWVtcHJlIG11Y2hhcyBtZW5vcywgbGEgY29tcGFyYWNpw7NuIHZpc3VhbCBlbiB0w6lybWlub3MgYWJzb2x1dG9zIHBpZXJkZSBzZW50aWRvLgojIGdnX21pc3NfdmFyKHggPSBiYXNlLCBmY3QgPSBDb21wbF9TYW5nX1RvZG9zKQojIGdnX21pc3NfdmFyKGJhc2UsIGZhY2V0ID0gQ29tcGxfU2FuZ19JbnRlcm0pCiMgZ2dfbWlzc192YXIoYmFzZSwgZmFjZXQgPSBDb21wbF9TYW5nX01heW9yKQoKIyBSZWxhY2nDs24gY29uIG90cmFzIHZhcmlhYmxlcy4KYWdncl9wbG90IDwtIGFnZ3IoYmFzZSwgY29sPWMoJ2N5YW4nLCdyZWQnKSwgbnVtYmVycz1UUlVFLCBzb3J0VmFycz1UUlVFLCBsYWJlbHM9bmFtZXMoYmFzZSksIGNleC5heGlzPS43LCBnYXA9MywgeWxhYj1jKCJHcsOhZmljbyA1IC0gUHJvcG9yY2nDs24gZGUgdmFsb3JlcyBwZXJkaWRvcyBwb3IgdmFyaWFibGUgKG4gPSA2ODQpIiwiR3LDoWZpY28gNiAtIFBhdHLDs24gZGUgdmFsb3JlcyBwZXJkaWRvcyBlbiBsYSBtYXRyaXogZGUgZGF0b3MgKG4gPSA2ODQpIikpICMgRXN0w6FuIG11eSBidWVub3MgZXN0b3MgZ3LDoWZpY29zLiBDYW1iacOpIGVsIGF6dWwgb2JzY3VybyBwb3IgY3lhbiwgcXVlIHBlcm1pdGUgYXByZWNpYXIgbWVqb3IgbGEgZGlzdHJpYnVjacOzbiBwb3IgZGF0by4gWSBsZSBjYW1iacOpIGVsIHTDrXR1bG8gcG9ycXVlLCBlbiB2ZXJkYWQsIGVsIHByaW1lcm8gbm8gc2Vyw61hIHVuIGhpc3RvZ3JhbWE6IG11ZXN0cmEgbGEgcHJvcG9yY2nDs24gZGUgdmFsb3JlcyBwZXJkaWRvcyBwb3IgdmFyaWFibGUsIHVuYSBqdW50byBhIGxhIG90cmEuIEVsIHNlZ3VuZG8sIGVuIGNhbWJpbywgbXVlc3RyYSBjw7NtbyBzZSBkaXN0cmlidXllbiBsb3MgdmFsb3JlcyBwZXJkaWRvcyBwb3IgVUEgeSBwb3IgVmFyaWFibGVzLiBRdWl6w6EgcG9kYW1vcyBkZWphciBlc3RvcyBkb3MgZ3LDoWZpY29zIGp1bnRvIHkgc2FjYXIgZWwgcXVlIHlvIHRpdHVsw6kgMy4KCiMgU2FjbyBhIGxvcyBjYXNvcyBjb24gZmFsdGFudGVzCmJkX3BydWViYSA8LSBuYS5vbWl0KGJhc2UpCm5faW5pY2lhbCA8LSBucm93KGJhc2UpCm5fZmluYWwgPC0gbnJvdyhiZF9wcnVlYmEpCihuX2luaWNpYWwtIG5fZmluYWwpL25faW5pY2lhbAoKI0Rlc2NyaXB0aXZhIHNlZ3VuIHNpIHRpZW5lIG8gbm8gZmFsdGFudGVzCmJhc2UkbWlzcy51bml2PC1pZmVsc2UoIWlzLm5hKGJhc2UkQ29tcGxfU2FuZ19Ub2RvcyksIDAsIDEpCnRhYjFfbWlzcyA8LSB0YWJsZWJ5KG1pc3MudW5pdiB+IC4sIGRhdGEgPSBiYXNlKQp0YWIxX21pc3MKc3VtbWFyeSh0YWIxX21pc3MpCmBgYAo+IC0gTGEgYmFzZSBjb250aWVuZSB1biBgciBwcm9wX21pc3MoYmFzZSkqMTAwYCAlIGRlIHZhbG9yZXMgcGVyZGlkb3MgeS9vIG5vIHJlZ2lzdHJhZG9zLiBFbCBHcsOhZmljbyAxIG11ZXN0cmEgbG9zIHZhbG9yZXMgcGVyZGlkb3MgcG9yIHZhcmlhYmxlIHkgc2Vnw7puIGVsIHRpcG8gZGUgdmFyaWFibGU6IGN1YWxpdGF0aXZhIG8gY3VhbnRpdGF0aXZhLiBMb3MgR3LDoWZpY29zIDIsIDMgeSA0IG11ZXN0cmFuIGxvcyBwb3JjZW50YWplcyBkZSB2YWxvcmVzIG5vIHJlZ2lzdHJhZG9zIGFncnVwYWRvcyBzZWfDum4gZGVzZW5sYWNlIGRlIHNhbmdyYWRvIHRvdGFsLCBpbnRlcm1lZGlvIHkgbWF5b3IuIEVuIGVsIEdyw6FmaWNvIDUgc2UgcHVlZGVuIGFwcmVjaWFyIGxhcyBwcm9wb3JjaW9uZXMgZGUgdmFsb3JlcyBwZXJkaWRvcyBwb3IgdmFyaWFibGVzLCB5IGVuIGVsIDYgZWwgcGF0csOzbiBnZW5lcmFsIGRlIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIHZhbG9yZXMgZmFsdGFudGVzIGVuIGxhIG1hdHJpeiBkZSBkYXRvcy48YnI+ClPDs2xvIC4uLi4gcmVnaXN0cm9zIGRlIGxhIGJhc2UgZXN0YWJhbiBjb21wbGV0b3MsIGRlIG1hbmVyYSBxdWUgYWwgYHIgKChuX2luaWNpYWwtIG5fZmluYWwpL25faW5pY2lhbCkqMTAwYCAlIGRlIGxvcyByZWdpc3Ryb3MgbGVzIGZhbHRhYmEgYWwgbWVub3MgdW4gdmFsb3IuPGJyPgpUcmVzIHZhcmlhYmxlcyBjb25jZW50cmFuIGxhIG1heW9yIGNhbnRpZGFkIGRlIHZhbG9yZXMgZmFsdGFudGVzOiBfRUNPVFRfUFNBUF8sIGNvbiBgciBuX21pc3MoYmFzZSRFQ09UVF9QU0FQKWAgdmFsb3JlcyBwZXJkaWRvcywgeSBfRUNPVFRfVEFQU0VfLCBjb24gYHIgbl9taXNzKGJhc2UkRUNPVFRfVEFQU0UpYCB2YWxvcmVzIHBlcmRpZG9zLiBTZSB0cmF0YSBkZSBtZWRpZGFzIGRlIGxhIGZ1bmNpw7NuIGNhcmTDrWFjYSBwb3IgZWNvZ3JhZsOtYSB0cmFuc3RvcsOhY2ljYS4gTGEgdmFyaWFibGUgX0Jpb21hcmNfcG9zXywgcXVlIHJlZ2lzdHJhIG1hcmNhZG9yZXMgcG9zaXRpdm9zIGRlIGVuemltYXMgY2FyZMOtYWNhcywgbXVlc3RyYSBgciBuX21pc3MoYmFzZSRCaW9tYXJjX3BvcylgIHZhbG9yZXMgZmFsdGFudGVzLiBFbiBtZW5vciBtZWRpZGEsIGVsIHRpZW1wbyBkZSBpbnRlcm5hY2nDs24sIHZhcmlhYmxlIF9UaWVtcG9JbnRfLCBwcmVzZW50YSBgciBuX21pc3MoYmFzZSRUaWVtcG9JbnQpYCB2YWxvcmVzIHBlcmRpZG9zLCB5IGxhIG1lZGljacOzbiBkZSBkaXNmdW5jacOzbiB2ZW50cmljdWxhciBkZXJlY2hhIHBvciBlY29ncmFmw61hIHRyYW5zdG9yw6FjaWNhLCB2YXJpYWJsZSBfRUNPVFRfRGlzZlZEXywgYHIgbl9taXNzKGJhc2UkRUNPVFRfRGlzZlZEKWAgdmFsb3JlcyBwZXJkaWRvcy48YnI+CkVzdGEgbWFnbml0dWQgZGUgdmFsb3JlcyBwZXJkaWRvcyBvIGZhbHRhbnRlcyBqdXN0aWZpY2EgaW1wbGVtZW50YXIgbWVjYW5pc21vcyBkZSBpbXB1dGFjacOzbiBxdWUgaW1waWRhbiBwZXJkZXIgZWwgYHIgKDEtKChuX2luaWNpYWwtIG5fZmluYWwpL25faW5pY2lhbCkpKjEwMGAgJSBkZSBsb3MgZGF0b3MgY29uc3RydWlkb3MgZW4gZWwgdHJhYmFqbyBkZSBjYW1wbywgcXVlIGVzIGVsIHBvcmNlbnRhamUgZGUgdW5pZGFkZXMgZGUgYW7DoWxpc2lzIGNvbiBhbCBtZW5vcyB1biB2YWxvciBwZXJkaWRvLjxicj4KCiMjIyBiKSBNYXRyaXggeSBncsOhZmljb3MgZGUgY29ycmVsYWNpw7NuCgo+IC0gICBTZSByZWFsaXphIGVsIGFuw6FsaXNpcyBkZSBjb3JyZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzOgoKYGBge3J9CiMgQ2hlcXVlbyBjdWFsZXMgc29uIGxhcyB2YXJpYWJsZXMgbnVtw6lyaWNhcyBwYXJhIHBvZGVyIGNhbGN1bGFyIGxhIG1hdHJpeiBkZSBjb3JyZWxhY2nDs24KCmhlYWQoYmFzZSkKCiMgQ2FsY3VsbyBtYXRyaXogZGUgY29ycmVsYWNpw7NuIHBhcmEgbG9zIHJlZ2lzdHJvcyBjb21wbGV0b3MgKG9taXRpZW5kbyBmYWx0YW50ZXMpIGNvbiBhbWJvcyBtw6l0b2RvcyAKIyBQZWFyc29uCm1hdHJpei5jb3JyZWwucGUgPC0gYmFzZSAlPiUgIGRwbHlyOjpzZWxlY3RfaWYoaXMubnVtZXJpYykgJT4lCiBjb3JyZWxhdGUodXNlID0gImNvbXBsZXRlLm9icyIsIG1ldGhvZCA9ICJwZWFyc29uIikKCiNBcm1vIHRhYmxhIGRlIGNvcnJlbGFjacOzbiBjb24gbcOpdG9kbyBkZSBQZWFyc29uIAptYXRyaXouY29ycmVsLnBlJT4lCiAgc2hhdmUoKSAlPiUKICBmYXNoaW9uKCkgCgojIFNwZWFybWFuCm1hdHJpei5jb3JyZWwuc3AgPC0gYmFzZSAlPiUgIGRwbHlyOjpzZWxlY3RfaWYoaXMubnVtZXJpYykgJT4lCiBjb3JyZWxhdGUodXNlID0gImNvbXBsZXRlLm9icyIsIG1ldGhvZCA9ICJzcGVhcm1hbiIpCgojQXJtbyB0YWJsYSBkZSBjb3JyZWxhY2nDs24gY29uIG3DqXRvZG8gZGUgU3BlYXJtYW4KbWF0cml6LmNvcnJlbC5zcCAlPiUgCiAgc2hhdmUoKSAlPiUgICAKICBmYXNoaW9uKCkKCiNHcmFmaWNvIHNvbG8gc3BlYXJtYW4geWEgcXVlIGVzIGVsIG3DoXMgcm9idXN0byBhbnRlIHByZXNlbmNpYSBkZSBvdXRsaWVycwptYXRyaXouY29ycmVsLnNwICU+JSBycGxvdChjb2xvcnMgPSBjKCJyZWQiLCAiYmx1ZSIpKQoKYGBgCgojIyMgYykgSW50ZXJwcmV0YWNpw7NuIGNvcnJlbGFjacOzbgoKLSAgIFNlIG9ic2VydmEgc29sYW1lbnRlIHVuYSBncmFuIGFzb2NpY2FjacOzbiBwb3NpdGl2YSBmdWVydGUgZW50cmUgbGFzIHZhcmlhYmxlcyBoZW1hdG9yY3JpdG8sICpIdG8qLCB5IGhlbW9nbG9iaW5hLCAqSGIqIGNvbiB1bmEgY29ycmVsYWNpw7NuIGRlIDg3JSwgbG8gY3VhbCB0aWVuZSBzZW50aWRvIHlhIHF1ZSBkZSBsYSBoZW1vZ2xvYmluYSByZXN1bHRhIGVsIGhlbXRvY3JpdG8uIEVuIGxvcyBtb2RlbG9zIGEgZXN0dWRpYXIgdG9tYXJlbW9zIGxhIGRlY2lzacOzbiBkZSB1dGlsaXphciBIYiBjb21vIHZhcmlhYmxlLCB5YSBxdWUgZXMgbGEgdmFyaWFibGUgdXRpbGl6YWRhIGVuIHRvZG9zIGxvcyBzY29yZXMuCi0gICBUYW1iacOpbiBzZSB2ZSBncmFuIGFzb2NpYWNpw7NuIHBvc2l0aXZhIGZ1ZXJ0ZSBlbnRyZSBsYXMgdmFyaWFibGVzICpQRVNJY2FsYyogeSAqUEVTSV9DbGFzaWYqLCB5YSBxdWUgbGEgY2xhc2lmaWNhY2nDs24gc2UgcmVhbGl6YSBkZXNkZSBlbCBjw6FsY3VsbyBudW3DqXJpY28gZGUgUEVTSS4gU2UgdG9tYSBsYSBkZWNpc2nDs24gZGUgZGVqYXIgbm8gbGEgY2xhc2lmaWNhY2nDs24gc2lubyBlbCBjw6FsY3VsbyBkZSBQRVNJIChQRVNJY2FsYykuCgojIyAzKSAqKlByZXBhcmFjacOzbiBkZSBsb3MgZGF0b3MqKiAoSSkKCiMjIyBhKSBFbGltbmluYWNpw7NuIGRlIGxhIHZhcmlhYmxlcyAqSHRvKiwgKlBFU0lfY2xhc2lmKiwgKlBFU0lzQ2FsYyogeSAqUEVTSXNfQ2xhc2lmKgoKPiAtICAgU2UgZWxpbWluYSBsYSB2YXJpYWJsZSBIdG8gcG9yIHJlZ2lzdHJhciBjb3JyZWxhY2nDs24gcG9zaXRpdmEgZnVlcnRlIGNvbiBsYSB2YXJpYWJsZSBIYiAoMC44NykuCkxhcyBvdHJhcyB2YXJpYWJsZXMgc2UgZWxpbWluYW4geSBzZSBkZWphbiBzb2xvIGxvcyBzY29yZXMgb3JpZ2luYWxlcy4gCgpgYGB7cn0KI0FybW8gbnVldm8gZGF0YXNldCBleGNsdXllbmRvIGxhIHZhcmlhYmxlIEh0bwpiYXNlXzMgPC0gYmFzZSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoLiwgLWMoTGFiX0h0bywgUEVTSV9jbGFzaWYsIFBFU0lzQ2FsYywgUEVTSXNfQ2xhc2lmLCBSSUVURV9HcnVwbykpCmBgYAoKIyMjIGIpIEltcHV0YWNpw7NuIGRlIGxvcyBkYXRvcyBmYWx0YW50ZXMKCj4gLSAgIFNlIGRlY2lkZSBpbXB1dGFyIGxvcyBkYXRvcyBkYXRvcyBmYWx0YW50ZXMsIG9idGVuaWVuZG8gNjg0IGRhdG9zIGRlIGxhcyA2NiB2YXJpYWJsZXMgZWxlZ2lkYXMuCgpgYGB7cn0KYmFzZV8zW3NhcHBseShiYXNlXzMsIGlzLmNoYXJhY3RlcildIDwtIGxhcHBseShiYXNlXzNbc2FwcGx5KGJhc2VfMywgaXMuY2hhcmFjdGVyKV0sIGFzLmZhY3RvcikKCmJhc2VfaW1wdXRhZGEgPC0gbWljZShiYXNlXzMsIG0gPSAxLCAgZGVmYXVsdE1ldGhvZCA9IGMoInBtbSIsICJsb2dyZWciLCAicG9seXJlZyIsICJwb2xyIiksIG1heGl0ID0gNSwgcHJpbnRGbGFnID0gRikKCnN1bW1hcnkoYmFzZV9pbXB1dGFkYSkKCmRlbnNpdHlwbG90KGJhc2VfaW1wdXRhZGEpCgpiYXNlX2ltcCA8LSBjb21wbGV0ZShiYXNlX2ltcHV0YWRhKQoKbl9taXNzKGJhc2VfaW1wKQpgYGAKCiMjIyBjKSBDcmVhY2nDs24gZGUgbnVldmFzIHZhcmlhYmxlcyBkZSBpbnRlcsOpcwoKPiAtIFNlIGNyZWEgbGEgdmFyaWFibGUgZGUgY2xlYXJlbmNlIGRlIGNyZWF0aW5pbmEgY29uIGZvcm11bGEgZGUgQ29ja2Nyb2Z0IEdhdWx0LiBDcmVhbW9zIGxhIHZhcmlhYmxlIGVkYWQgPjc1IGHDsW9zIHBhcmEgZXhwbG9yYXIgc2kgZXMgcHJlZGljdG9yIGRlIHNhbmdyYWRvLiBFcyB1bmEgdmFyaWFibGUgcXVlIHNlIGluY2x1eWUgZW4gZWwgc2NvcmUgZGUgUklFVEUgeSBwbGFxdWV0YXMgPDEwMC4wMDAgYSBtb2RvIGV4cGxvcmF0b3Jpby4gCgpgYGAge3J9CmJhc2VfaW1wJENsQ3IgPC0gKCgxNDAgLSBiYXNlX2ltcCRQYWNfRWRhZCkgKiBiYXNlX2ltcCRQZXNvKSAvICg3MiAqIGJhc2VfaW1wJExhYl9DcikKYmFzZV9pbXAkQ2xDciA8LSBpZmVsc2UgKGJhc2VfaW1wJFBhY19TZXggPT0gIkZlbWVuaW5vIiwgYmFzZV9pbXAkQ2xDciowLjg1LCBiYXNlX2ltcCRDbENyKQpzdW1tYXJ5KGJhc2VfaW1wJENsQ3IpCgpiYXNlX2ltcCRQYWNfRWRhZF9Db3J0ZSA8LSBpZmVsc2UgKGJhc2VfaW1wJFBhY19FZGFkID49IDc1LCAiU2kiLCAiTm8iKQpiYXNlX2ltcCRMYWJfUGxhcV9Db3J0ZSA8LSBpZmVsc2UgKGJhc2VfaW1wJExhYl9QbGFxID49IDEwMDAwMCwgIlNpIiwgIk5vIikKCmJhc2VfaW1wJFRFUF9tb3Rpdm9faW50IDwtIGlmZWxzZSAoYmFzZV9pbXAkTW90SW50ID09ICJURVAiLCAiU2kiLCAiTm8iKQoKYmFzZV9iYWNrdXAgPC0gYmFzZV9pbXAKYGBgCiMgKkFOQUxJU0lTIEVYUExPUkFUT1JJTyoKIyMgNCkgKipBbmFsaXNpcyBleHBsb3JhdG9yaW9zKiogKElJKQoKIyMjIGEpIFRhYmxhcyBkZXNjcmlwdGl2YXMgZGUgbGFzIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzOgoKYGBge3J9CgojVEFCTEEgMQojVGFibGEgcmVzdW1lbiBjdWFudGl0YXRpdmFzIGNvbiBtZWRpYS9TRCwgbWVkaWFuYS9JUQpyZXN1bWVuX2N1YW50IDwtIHJvdW5kKGJhc2ljU3RhdHMoYmFzZV9pbXBbLGMoIlBhY19FZGFkIiwiQ0NfVEFTX0luZ3Jlc28iLCAiQ0NfRkNfSW5ncmVzbyIsICJXZWxscyIsICJQRVNJY2FsYyIsICJSSUVURV9DYWxjIiwgIkxhYl9IYiIsICJMYWJfQ3IiLCAiTGFiX1BsYXEiLCAiRUNPVFRfVEFQU0UiLCAiRUNPVFRfUFNBUCIsICJUaWVtcG9JbnQiKV0pLCBkaWdpdHMgPSAyKQprYmwocmVzdW1lbl9jdWFudCwgZGlnaXRzID0gMSxjYXB0aW9uPSAiVGFibGEgcmVzdW1lbiAtIFZhcmlhYmxlcyBjdWFudGl0YXRpdmFzIiApJT4lCiAga2FibGVfcGFwZXIoImhvdmVyIiwgZnVsbF93aWR0aCA9IFQpCgpgYGAKCiMjIyBiKSBUYWJsYSAxIC0gVGFibGEgcmVzdW1lbiBnbG9iYWwKCmBgYHtyfQoKI1RhYmxhIDEgLSBSZXN1bWVuIGdsb2JhbApteXZhcnNfdGFiMSA8LSBuYW1lcyhiYXNlX2ltcCkKbXljYXRfdGFiMSA8LSBjKCJQYWNfU2V4IiwgIlBhY19Db2JlcnR1cmEiLCAiUGFjX0hUQSIsICJQYWNfREJUIiwgIlBhY19UQlEiLCAiUGFjX0RMUCIsICJQYWNfSUNDIiwgIlBhY19GQSIsICJQYWNfRVRWcHJlIiwgIlBhY19URVBwcmUiLCAiUGFjX1RFUF9wcmV2aW9fbWVub3JfM19tZXNlcyIsICJQYWNfRGVhbWIiLCAiUGFjX1JlcG9zbyIsICJQYWNfRVBPQyIsICJQYWNfQUNWZ2xvYmFsIiwgIlBhY19IZW1vcnJhZ2lhX1ByZXZpYV9NYXlvcl9Ub2RhcyIsICJQYWNfSGVtb3JyYWdpYV9QcmV2aWFfTWF5b3JfUmVjaWVudGUiLCAiUGFjX0VuZkF1dG8iLCAiUGFjX0lSQ2dsb2JhbCIsICJQYWNfU21lUHJvY29hZyIsICJQRVNJX0NhbmNlciIsICJQYWNfQUNPX1ByZXZpYSIsICJNb3RJbnQiLCAiUEVTSV9EZXRfU2VucyIsICJQRVNJX1RhcXVpY2FyZGlhIiwiUEVTSV9IaXBvdGVuc2lvbiIsICJQRVNJX1RhcXVpcG5lYSIsICJQRVNJX0hpcG90ZXJtaWEiLCAiQ0NfU2FPOTAiLCAiUGFjX0N4X1RvdGFsIiwgIkJpb21hcmNfcG9zIiwgIkVDT1RUX0ZTVkkiLCJFQ09UVF9EaXNmVkQiLCAiQWx0YV9DYXJnYV9Ucm9tYm9fVEFDIiwgIkludF9PX0FsdG9fUmllc2dvX0NhbGMiLCAiRXN0Umllc2dvIiwgIlNlcnZpY2lvQ2FyZ28iLCAiUklFVEVfR3J1cG8iLCAiQUNPaW50IiwgIkZWQ0kiLCAiVHRvX1JlcGVyZiIsICJUTF9jdWFsIiwgIkNvbXBsX1NhbmdfVG9kb3MiLCAiQ29tcGxfU2FuZ19NYXlvciIsICJDb21wbF9TYW5nX0ludGVybSIsICJDb21wbF9Tb3BvcnRlSERfTk8iLCAiQWx0YV9UdG9fVGlwb3NBQ08iLCAiRE9BQ19zaV92c19ubyIpCgpub19ub3JtYWwgPC0gYygiUGFjX0VkYWQiLCJDQ19UQVNfSW5ncmVzbyIsICJDQ19GQ19JbmdyZXNvIiwgIldlbGxzIiwgIlBFU0ljYWxjIiwgIlJJRVRFX0NhbGMiLCAiTGFiX0hiIiwgIkxhYl9DciIsICJMYWJfUGxhcSIsICJFQ09UVF9UQVBTRSIsICJFQ09UVF9QU0FQIiwgIlRpZW1wb0ludCIsICJDbENyIiwgIlBlc28iLCAiQ0NfSG9yYXNfU3hfQWRtaXNpb24iLCAgIkxhYl9HQiIsICJDQ19TYU9fSW5ncmVzbyIsICJDQ19GUl9JbmdyZXNvIikKdmFyaWFibGVfcnRhIDwtICJDb21wbF9TYW5nX1RvZG9zIgoKdGFiMSA8LSBDcmVhdGVUYWJsZU9uZSh2YXJzPW15dmFyc190YWIxLCBkYXRhID0gYmFzZV9pbXAsIGZhY3RvclZhcnMgPSBteWNhdF90YWIxLCBpbmNsdWRlTkEgPSBGLCB0ZXN0ID0gVCkKCmFfdGFiMSA8LSBwcmludCh0YWIxLCAgcXVvdGUgPSBGQUxTRSwgbm9TcGFjZXMgPSBUUlVFLCBub25ub3JtYWwgPSBub19ub3JtYWwsCiAgICAgICAgICAgICAgICBwcmludFRvZ2dsZSA9IEZBTFNFLCBmb3JtYXRPcHRpb25zID0gbGlzdChiaWcubWFyayA9ICIsIikpCgoKa2JsKGFfdGFiMSwgZGlnaXRzID0gMSwgY2FwdGlvbiA9ICIgVEFCTEEgMTogUG9ibGFjacOzbiBnZW5lcmFsIiklPiUKICBrYWJsZV9jbGFzc2ljKGZ1bGxfd2lkdGggPSBGLCBodG1sX2ZvbnQgPSAiQ2FtYnJpYSIpICNDQU1CSUEgRElTRcORTyBERSBUQUJMQQoKYGBgCgojIyMgYykgVGFibGEgMiAtIFNlZ8O6biBDb21wbGljYWNpw7NuIFNhbmdyYWRvIC0gVE9ET1MgTE9TIFNBTkdSQURPUwoKYGBge3J9CiNUQUJMQSAyIC0gU1VCUE9CTEFDSU9ORVMgQ09OIFkgU0lOIENPTVBMSUNBQ0lPTl9TQU5HUkFETwpteXZhcnNfdGFiMiA8LSBuYW1lcyhiYXNlX2ltcCkKbXljYXRfdGFiMiA8LSBjKCJQYWNfU2V4IiwgIlBhY19Db2JlcnR1cmEiLCAiUGFjX0hUQSIsICJQYWNfREJUIiwgIlBhY19UQlEiLCAiUGFjX0RMUCIsICJQYWNfSUNDIiwgIlBhY19GQSIsICJQYWNfRVRWcHJlIiwgIlBhY19URVBwcmUiLCAiUGFjX1RFUF9wcmV2aW9fbWVub3JfM19tZXNlcyIsICJQYWNfRGVhbWIiLCAiUGFjX1JlcG9zbyIsICJQYWNfRVBPQyIsICJQYWNfQUNWZ2xvYmFsIiwgIlBhY19IZW1vcnJhZ2lhX1ByZXZpYV9NYXlvcl9Ub2RhcyIsICJQYWNfSGVtb3JyYWdpYV9QcmV2aWFfTWF5b3JfUmVjaWVudGUiLCAiUGFjX0VuZkF1dG8iLCAiUGFjX0lSQ2dsb2JhbCIsICJQYWNfU21lUHJvY29hZyIsICJQRVNJX0NhbmNlciIsICJQYWNfQUNPX1ByZXZpYSIsICJNb3RJbnQiLCAiUEVTSV9EZXRfU2VucyIsICJQRVNJX1RhcXVpY2FyZGlhIiwiUEVTSV9IaXBvdGVuc2lvbiIsICJQRVNJX1RhcXVpcG5lYSIsICJQRVNJX0hpcG90ZXJtaWEiLCAiQ0NfU2FPOTAiLCAiUGFjX0N4X1RvdGFsIiwgIkJpb21hcmNfcG9zIiwgIkVDT1RUX0ZTVkkiLCJFQ09UVF9EaXNmVkQiLCAiQWx0YV9DYXJnYV9Ucm9tYm9fVEFDIiwgIkludF9PX0FsdG9fUmllc2dvX0NhbGMiLCAiRXN0Umllc2dvIiwgIlNlcnZpY2lvQ2FyZ28iLCAiUklFVEVfR3J1cG8iLCAiQUNPaW50IiwgIkZWQ0kiLCAiVHRvX1JlcGVyZiIsICJUTF9jdWFsIiwgIkNvbXBsX1NhbmdfVG9kb3MiLCAiQ29tcGxfU2FuZ19NYXlvciIsICJDb21wbF9TYW5nX0ludGVybSIsICJDb21wbF9Tb3BvcnRlSERfTk8iLCAiQWx0YV9UdG9fVGlwb3NBQ08iLCAiRE9BQ19zaV92c19ubyIpCgpub3JtX3Rlc3Q8LWFwcGx5KGJhc2VfaW1wWywgYygiUGFjX0VkYWQiLCJDQ19UQVNfSW5ncmVzbyIsICJDQ19GQ19JbmdyZXNvIiwgIldlbGxzIiwgIlBFU0ljYWxjIiwgIlJJRVRFX0NhbGMiLCAiTGFiX0hiIiwgIkxhYl9DciIsICJMYWJfUGxhcSIsICJFQ09UVF9UQVBTRSIsICJFQ09UVF9QU0FQIiwgIlRpZW1wb0ludCIpXSwgMiwgZnVuY3Rpb24oeCkgc2hhcGlyby50ZXN0KHgpJHAudmFsdWUpCm5vcm1fdGVzdAoKb3B0aW9ucyhkaWdpdHM9Mywgc2NpcGVuID0gOTk5KQoKbm9fbm9ybWFsIDwtIGMoIlBhY19FZGFkIiwiQ0NfVEFTX0luZ3Jlc28iLCAiQ0NfRkNfSW5ncmVzbyIsICJXZWxscyIsICJQRVNJY2FsYyIsICJSSUVURV9DYWxjIiwgIkxhYl9IYiIsICJMYWJfQ3IiLCAiTGFiX1BsYXEiLCAiRUNPVFRfVEFQU0UiLCAiRUNPVFRfUFNBUCIsICJUaWVtcG9JbnQiKQp2YXJpYWJsZV9ydGEgPC0gIkNvbXBsX1NhbmdfVG9kb3MiCgp0YWIyIDwtIENyZWF0ZVRhYmxlT25lKHZhcnMgPSBteXZhcnNfdGFiMiwgZGF0YSA9IGJhc2VfaW1wLCBmYWN0b3JWYXJzID0gbXljYXRfdGFiMiwgc3RyYXRhID0gdmFyaWFibGVfcnRhLCBpbmNsdWRlTkEgPSBGLCB0ZXN0ID0gVCkKCmFfdGFiMiA8LSBwcmludCh0YWIyLCAgcXVvdGUgPSBGQUxTRSwgbm9TcGFjZXMgPSBUUlVFLG5vbm5vcm1hbCA9IG5vX25vcm1hbCwKICAgICAgICAgICAgICAgIHByaW50VG9nZ2xlID0gRkFMU0UsIGZvcm1hdE9wdGlvbnMgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkKCmtibChhX3RhYjIsIGRpZ2l0cyA9IDEsIGNvbC5uYW1lcyA9IGMoICJDb21wbGljYWNpw7NuIFNhbmdyYWRvID0gTm8iLCAiQ29tcGxpY2FjacOzbiBTYW5ncmFkbyA9IFNpIiwgInAtdmFsdWUiLCAidGVzdCIpLCBjYXB0aW9uID0gIiBUQUJMQSAyIiklPiUKICBrYWJsZV9jbGFzc2ljKGZ1bGxfd2lkdGggPSBGLCBodG1sX2ZvbnQgPSAiQ2FtYnJpYSIpCgpgYGAKCiMjIDUpICoqQW7DoWxpc2lzIGRlIG91dGxpZXJzKiogKEkpCgojIyMgYSkgQm94cGxvdHMgZGUgbGEgdmFyaWFibGUgKkNvbXBsX1NhbmdyYWRvKiBwb3IgdmFyaWFibGVzIGNvbnNpZGVyYWRhcyBjbGluaWNhbWVudGUgc2lnbmlmaWNhdGl2YXM6Cgo+IC0gICBBIGZpbiBkZSBkZXRlY3RhciB2YWxvcmVzIGF0w61waWNvcywgc2Ugb3B0w7MgcG9yIGVmZWN0dWFyIHNjYXR0ZXJwbG90cyBpbmRpdmlkdWFsZXMgcGFyYSBhbGd1bmFzIHZhcmlhYmxlcyBjbGluaWNhbWVudGUgc2lnbmlmaWNhdGl2YXMgYWdydXDDoW5kb2xhcyBzZWfDum4gY29tcGxpY2FjacOzbiBkZSBzYW5ncmFkbzogZWRhZCwgaGVtb2dsb2JpbmEgKEhiKSwgcmVjdWVudG8gZGUgcGxhcXVldGFzIHkgc2NvcmUgZGUgUEVTSS4KCmBgYHtyfQojQU7DgUxJU0lTIEdSQUZJQ08gRVhQTE9SQVRPUklPIHNlZ8O6biBDT01QTElDQUNJT05fU0FOR1JBRE8KCiMjQm94cGxvdCBkZSBDb21wbGljYWNpw7NuIGRlIHNhbmdyYWRvIHNlZ8O6biBSSUVURSBjYWxjdWxhZG8gKFJJRVRFX0NhbGMpCmdncGxvdChiYXNlX2ltcCwgYWVzKHg9Q29tcGxfU2FuZ19Ub2RvcywgeT1SSUVURV9DYWxjLCBmaWxsID0gQ29tcGxfU2FuZ19Ub2RvcykpICsgCiAgZ2VvbV9ib3hwbG90KCkgKyAKICBnZW9tX2ppdHRlcihzaGFwZT0xNiwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKDAuMikpCgoKIyNCb3hwbG90IGRlIFNleG8gc2Vnw7puIFJJRVRFIGNhbGN1bGFkbyAoUklFVEVfQ2FsYykKZ2dwbG90KGJhc2VfaW1wLCBhZXMoeD1QYWNfU2V4LCB5PVJJRVRFX0NhbGMsIGZpbGwgPSBQYWNfU2V4KSkgKyAKICBnZW9tX2JveHBsb3QoKSArCiAgZ2VvbV9qaXR0ZXIoc2hhcGU9MTYsIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcigwLjIpKQoKCiMjQm94cGxvdCBkZSBDb21wbGljYWNpw7NuIGRlIHNhbmdyYWRvIHNlZ8O6biBoZW1vZ2xvYmluYSAoSGIpCmdncGxvdChiYXNlLCBhZXMoeD1Db21wbF9TYW5nX1RvZG9zLCB5PUxhYl9IYiwgZmlsbCA9IENvbXBsX1NhbmdfVG9kb3MpKSArIAogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX2ppdHRlcihzaGFwZT0xNiwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKDAuMikpCgoKIyNCb3hwbG90IGRlIENvbXBsaWNhY2nDs24gZGUgc2FuZ3JhZG8gc2Vnw7puIHJlY3VlbnRvIGRlIFBsYXF1ZXRhcwpnZ3Bsb3QoYmFzZV9pbXAsIGFlcyh4PUNvbXBsX1NhbmdfVG9kb3MsIHk9TGFiX1BsYXEsIGZpbGwgPSBDb21wbF9TYW5nX1RvZG9zKSkgKyAKICBnZW9tX2JveHBsb3QoKQoKCiMjQm94cGxvdCBkZSBDb21wbGljYWNpw7NuIGRlIHNhbmdyYWRvIHNlZ8O6biBzY29yZSBkZSBQRVNJIGNhbGN1bGFkbyAoUEVTSV9DYWxjKQpnZ3Bsb3QoYmFzZV9pbXAsIGFlcyh4PUNvbXBsX1NhbmdfVG9kb3MsIHk9UEVTSWNhbGMsIGZpbGwgPSBDb21wbF9TYW5nX1RvZG9zKSkgKyAKICBnZW9tX2JveHBsb3QoKQoKCiMjQm94cGxvdCBkZSBDb21wbGljYWNpw7NuIGRlIHNhbmdyYWRvIHNlZ8O6biBFZGFkCmdncGxvdChiYXNlX2ltcCwgYWVzKHg9Q29tcGxfU2FuZ19Ub2RvcywgeT1QYWNfRWRhZCwgZmlsbCA9IENvbXBsX1NhbmdfVG9kb3MpKSArIAogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX2ppdHRlcihzaGFwZT0xNiwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKDAuMikpCgoKCmBgYAoKPiAtIFNlIG9ic2VydmFuIG91dGxpZXJzIGVuIHRyZXMgdmFyaWFibGVzOiBMYWJfR0IsIExhYl9QbGFxIHkgUEVTSV9DYWxjLiBFc3BlY8OtZmljYW1lbnRlLCBoYXkgdmFyaW9zIHZhbG9yZXMgcXVlIHN1cGVyYW4gZWwgdmFsb3IgZGVsIHRlcmNlciBjdWFydGlsIGVuIExhYl9QbGFxLCBjb24gaW5kaXZpZHVvcyB0ZW5pZW5kbyBtw6FzIGRlIDQ1MC4wMDAgcGxhcXVldGFzIHkgdmFyaW9zIHBhY2llbnRlcyBxdWUgcHJlc2VudGFyb24gbml2ZWxlcyBhdMOtcGljb3MgZGUgUEVTSSAoYXByb3hpbWFkYW1lbnRlIFw+MTcwKSwgeSB1biBzb2xvIHZhbG9yIGF0w61waWNvIG1lbm9yIGFsIHByaW1lciBjdWFydGlsIChcPDI1IGRlIFBFU0kpLgo+IC0gQWRlbcOhcyBzZSB2ZW4gYWxndW5zbyBzdWpldG9zIGNvbiBtdXkgYWx0byB2YWxvciBkZSBHQiwgcG9yIGxvIGN1YWwgc2Vyw6FuIGVzdHVkaWFkb3MuCgpgYGB7cn0KbWF4KGJhc2VfaW1wJExhYl9QbGFxLCBuYS5ybSA9IFQpCm1heChiYXNlX2ltcCRQRVNJY2FsYykKbWF4KGJhc2VfaW1wJExhYl9HQikKCm1pbigoYmFzZV9pbXAkUEVTSWNhbGMpKQoKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZHBseXIpCgphdGlwaWNvc19wbGFxIDwtIGJhc2VfaW1wICU+JSAKICBmaWx0ZXIoTGFiX1BsYXEgPj0gNDUwMDAwKQoKYXRpcGljb3NfUEVTSTwtIGJhc2VfaW1wICU+JSAKICAgIGZpbHRlcihQRVNJY2FsYyA+PSAxNzApICU+JQogICAgbXV0YXRlKFBFU0kgPSBQRVNJY2FsYywgRWRhZCAgPSBQYWNfRWRhZCwgU2V4byA9IFBhY19TZXgsCiAgICAgICAgICAgIElDQyA9IFBhY19JQ0MsIEVQT0MgPSBQYWNfRVBPQywgRkMgPSBDQ19GQ19JbmdyZXNvLAogICAgICAgICAgICBUQVMgPSBDQ19UQVNfSW5ncmVzbywgRlIgPSBDQ19GUl9JbmdyZXNvLCBTYXQwMiA9IENDX1NhT19JbmdyZXNvKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoUEVTSSwgRWRhZCwgU2V4bywgSUNDLCBFUE9DLCBGQywgVEFTLCBGUiwgU2F0MDIpCgphdGlwaWNvc19QRVNJMiA8LSBiYXNlX2ltcCAlPiUgCiAgICBmaWx0ZXIoUEVTSWNhbGMgPT0gMTYpCgphdGlwaWNvc19HQiA8LSBiYXNlX2ltcCAlPiUgCiAgICBmaWx0ZXIoYmFzZV9pbXAkTGFiX0dCID42MDAwMCkKCgpgYGAKCj4gLSAgIFNlIHRvbWFyb24gZW4gY3VlbnRhIGxhcyB2YWxvcmVzIG91dGxpZXJzIChtYXlvcmVzIGFsIFEzKSBhcHJveGltYWRvcyBkZSBsYXMgdmFyaWFibGVzLCB5IHNlIGVzdHVkaW8gZWwgY2FzbyBjb24gUEVTSWNhbGMgaWd1YWwgYSAxNi4gTm8gc2Ugb2JzZXJ2YXJvbiBjYXNvcyBtYWwgY2FyZ2Fkb3MgbmkgY29uIG11Y2hhIGluZmx1ZW5jaWEgcG9yIGxvIHRhbnRvIHRvZG9zIGVzdG9zIGNhc29zIHNlIGNvbnNpZGVyYXJvbiB2w6FsaWRvcyB5IHF1ZWRhcsOhbiBlbiBsYSBiYXNlIGRlIGRhdG9zLgoKCiMjIDYpICoqQW5hbGlzaXMgdW5pdmFyaWFkbyB5IGFuYWxpc2lzIGRlIHNlbnNpYmlsaWRhZCoqCgojIyMgYSkgQW5hbGlzaXMgdW5pdmFyaWFkbyAKCj4gLSBDb21vIHByaW1lciBtw6l0b2RvIGRlIGFuw6FsaXNpcyBzZSBlbGlnZSBsYSByZWdyZXNpw7NuIGxvZ8Otc3RpY2EgdW5pdmFyaWFkYSBkZSB0b2RhcyBsYXMgdmFyaWFibGVzLiBTZSB1dGxpesOzIHVuIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgZGUgMC4yIHBhcmEgdGVuZXIgYSBsYSB2YXJpYWJsZSBlbiBjb25zaWRlcmFjacOzbiBwYXJhIHVuIG1vZGVsbyBsb2fDrXN0aWNvIG11bHRpcGxlLgoKYGBge3J9CmJhc2VfdW5pdiA8LSBiYXNlX2ltcAoKIyBTZSBjb252aWVydGUgZW4gZmFjdG9yIGxhIHZhcmlhYmxlIElDQwpiYXNlX3VuaXYkUGFjX0lDQyA8LSBhcy5mYWN0b3IgKGJhc2VfdW5pdiRQYWNfSUNDKQpzdW1tYXJ5KGJhc2VfdW5pdiRQYWNfSUNDKQoKI1NlIGNvbnZpZXJ0ZSB2YXJpYWJsZSAqQ29tcGxfU2FuZ19Ub2RvcyBlbiBmYWN0b3I6Cgpsb2dpc3RpYy5kaXNwbGF5KChnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IENDX0ZDX0luZ3Jlc28sIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkpIzAuMDI0CmxvZ2lzdGljLmRpc3BsYXkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBDQ19UQVNfSW5ncmVzbywgZGF0YSA9IGJhc2VfdW5pdiwgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKSMwLjAwOApsb2dpc3RpYy5kaXNwbGF5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gQ0NfU2FPX0luZ3Jlc28sIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkjMC4wMDA5CmxvZ2lzdGljLmRpc3BsYXkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBMYWJfSGIsIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkjMC4wMgpsb2dpc3RpYy5kaXNwbGF5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gTGFiX0dCLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuMDQKbG9naXN0aWMuZGlzcGxheShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IENDX1RBU19JbmdyZXNvLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuMDA4CmxvZ2lzdGljLmRpc3BsYXkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBDQ19TYU9fSW5ncmVzbywgZGF0YSA9IGJhc2VfdW5pdiwgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKSMwLjAwMDkKbG9naXN0aWMuZGlzcGxheShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IFBFU0ljYWxjLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuMDAwNApsb2dpc3RpYy5kaXNwbGF5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gQmlvbWFyY19wb3MsIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkjMC4wMwpsb2dpc3RpYy5kaXNwbGF5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gRUNPVFRfRGlzZlZELCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuMDA4CgpiYXNlX3VuaXYkQ29tcGxfU2FuZ19Ub2RvcyA8LSBhcy5mYWN0b3IoYmFzZV91bml2JENvbXBsX1NhbmdfVG9kb3MpCgpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gUGFjX0lDQywgZGF0YSA9IGJhc2VfdW5pdiwgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKSAjMC4xMwpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gUGFjX0RlYW1iLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpICMwLjEwCnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBQYWNfQUNWZ2xvYmFsLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuMDQKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IFBhY19IZW1vcnJhZ2lhX1ByZXZpYV9NYXlvcl9Ub2RhcywgZGF0YSA9IGJhc2VfdW5pdiwgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKSMwLjAyCnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBQYWNfRW5mQXV0bywgZGF0YSA9IGJhc2VfdW5pdiwgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKSAjMC4yCnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBQYWNfSVJDZ2xvYmFsLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuMDIKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IFBhY19TbWVQcm9jb2FnLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuMjIKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IFBhY19DeF9Ub3RhbCwgZGF0YSA9IGJhc2VfdW5pdiwgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKSMwLjAyCgpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gUEVTSV9EZXRfU2VucywgZGF0YSA9IGJhc2VfdW5pdiwgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKSMwLjAwMwpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gUEVTSV9UYXF1aWNhcmRpYSwgZGF0YSA9IGJhc2VfdW5pdiwgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKSMwLjAxNQpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gUEVTSV9IaXBvdGVuc2lvbiwgZGF0YSA9IGJhc2VfdW5pdiwgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKSMwLjAxNQpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gUEVTSV9UYXF1aXBuZWEsIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkjMC4wMwpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gUEVTSV9IaXBvdGVybWlhLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpCgpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gQ0NfU2FPOTAsIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkjMC4wNQpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gQ0NfSG9yYXNfU3hfQWRtaXNpb24sIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkjMC4xMgpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gRUNPVFRfVEFQU0UsIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkjMC4wMDcKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IEVDT1RUX1BTQVAsIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkjMC4wMDUKCgpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gSW50X09fQWx0b19SaWVzZ29fQ2FsYywgZGF0YSA9IGJhc2VfdW5pdiwgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKSMwLjA0CnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBFc3RSaWVzZ28sIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkjU0lHIHRvZG9zCnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBTZXJ2aWNpb0NhcmdvLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuMDQKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IEZWQ0ksIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkjMC4wMDAwCnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBUdG9fUmVwZXJmLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuMDAzCnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBUTF9jdWFsLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpI1NJRyBkdWRvc28Kc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IENvbXBsX1NvcG9ydGVIRF9OTywgZGF0YSA9IGJhc2VfdW5pdiwgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKSMwMDAwMApzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gQWx0YV9UdG9fVGlwb3NBQ08sIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkjU0lHIHRvZG9zCnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBET0FDX3NpX3ZzX25vLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuMDE2CnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBXZWxscywgZGF0YSA9IGJhc2VfdW5pdiwgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKSMwLjAwNQpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gVGllbXBvSW50LCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuMDEKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IEhBU0JMRUQsIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkgIzAuMDYyCnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBBbHRhX0NhcmdhX1Ryb21ib19UQUMsIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkgIzAuMTYKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IENsQ3IsIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkgIzAuNTMKCgoKI05PIFNJR05JRklDQVRJVkFTOgpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gUGFjX0VkYWQsIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkjMC44MQpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gUGFjX0hUQSwgZGF0YSA9IGJhc2VfdW5pdiwgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKSMwLjc2CnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBQYWNfREJULCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuMzkKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IFBhY19UQlEsIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IFBhY19ETFAsIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkjMC4yMgpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gUGFjX0ZBLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuMjkKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IFBhY19FVFZwcmUsIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkjMC40NwpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gUGFjX1RFUF9wcmV2aW9fbWVub3JfM19tZXNlcywgZGF0YSA9IGJhc2VfdW5pdiwgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKSMwLjQ3CnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBQYWNfUmVwb3NvLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuODgKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IFBhY19FUE9DLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuNjYKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IFBFU0lfQ2FuY2VyLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuNTcKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IFBhY19BQ09fUHJldmlhLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuNzUKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IE1vdEludCwgZGF0YSA9IGJhc2VfdW5pdiwgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKQpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gQUNPaW50LCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuNDEwOApzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gSU1DLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuNTQ5CnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBDQ19GUl9JbmdyZXNvLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuMzUKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IExhYl9QbGFxLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuODgKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IEVDT1RUX0ZTVkksIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkjIE5PIFNJR04Kc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IFJJRVRFX0NhbGMsIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkjMC41MgpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gTGFiX0NyLCBkYXRhID0gYmFzZV91bml2LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpIzAuMzcKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IFBlc28sIGRhdGEgPSBiYXNlX3VuaXYsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkjMC4zNwoKYGBgCgo+IC0gRGVjaWRpbW9zIGV4cGxvcmFyIGxhcyB2YXJpYWJsZXMgY3VhbnRpdGF0aXZhcyBxdWUgbm8gc29uIHNpZ25pZmljYXRpdmFzIHkgcmVhbGl6YXIgdHJhbnNmb3JtYWNpb25lcyBwYXJhIHZlciBzaSBzZSBhanVzdGFuIGEgdW4gbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbG9nw61zdGljYS4gUGFyYSBlbGxvIHZlcmlmaWNhbW9zIHByaW1lcm8gY3VhbGVzIG5vIGN1bXBsZW4gZWwgc3VwdWVzdG8gZGUgbGluZWFsaWRhZCBkZSBsb3MgbG9naXRzCgojIyMgYikgU3VwdWVzdG8gbGluZWFsaWRhZCBkZSBsb2dpdAoKYGBge3J9CmJhc2VfbG9naXQgPC0gYmFzZV9pbXBbLCFuYW1lcyhiYXNlX2ltcCkgJWluJSBjKCJURVBfbW90aXZvX2ludCIsICJtaXNzLnVuaXYiLCJET0FDX3NpX3ZzX25vIildCm1fbG9naXRzIDwtIGdsbSAoQ29tcGxfU2FuZ19Ub2RvcyB+LiAsIGRhdGEgPSBiYXNlX2xvZ2l0LCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkKIyBQcmVkaWN0IHRoZSBwcm9iYWJpbGl0eSAocCkgb2YgZGlhYmV0ZSBwb3NpdGl2aXR5CnByb2JhYmlsaXRpZXMgPC0gcHJlZGljdChtX2xvZ2l0cywgdHlwZSA9ICJyZXNwb25zZSIpCnByZWRpY3RlZC5jbGFzc2VzIDwtIGlmZWxzZShwcm9iYWJpbGl0aWVzID4gMC4zLCAicG9zIiwgIm5lZyIpCmhlYWQocHJlZGljdGVkLmNsYXNzZXMpCgojMSkgUmVtb3ZlIHF1YWxpdGF0aXZlIHZhcmlhYmxlcyBmcm9tIHRoZSBvcmlnaW5hbCBkYXRhIGZyYW1lIGFuZCBiaW5kIHRoZSBsb2dpdCB2YWx1ZXMgdG8gdGhlIGRhdGE6CiMgU2VsZWN0IG9ubHkgbnVtZXJpYyBwcmVkaWN0b3JzCgpteWRhdGEgPC0gYmFzZV9sb2dpdCAlPiUKICBkcGx5cjo6c2VsZWN0X2lmKGlzLm51bWVyaWMpIApwcmVkaWN0b3JzIDwtIGNvbG5hbWVzKG15ZGF0YSkKIyBCaW5kIHRoZSBsb2dpdCBhbmQgdGlkeWluZyB0aGUgZGF0YSBmb3IgcGxvdApteWRhdGEgPC0gbXlkYXRhICU+JQogIG11dGF0ZShsb2dpdCA9IGxvZyhwcm9iYWJpbGl0aWVzLygxLXByb2JhYmlsaXRpZXMpKSkgJT4lCiAgZ2F0aGVyKGtleSA9ICJwcmVkaWN0b3JzIiwgdmFsdWUgPSAicHJlZGljdG9yLnZhbHVlIiwgLWxvZ2l0KQoKIzIpCmdncGxvdChteWRhdGEsIGFlcyhwcmVkaWN0b3IudmFsdWUsIGxvZ2l0KSkrCiAgZ2VvbV9wb2ludChzaXplID0gMC41LCBhbHBoYSA9IDAuMykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIpICsgCiAgdGhlbWVfYncoKSArIAogIGZhY2V0X3dyYXAofnByZWRpY3RvcnMsIHNjYWxlcyA9ICJmcmVlX3giKQoKI3JlYWxpemFtb3MgdHJhbnNmb3JtYWNpb25lcyBsb2dpc3RpY2FzIGRlIGxhcyB2YXJpYWJsZXMgQ2xDciwgUGxhcXVldGFzLCBQZXNvLCBTYXR1cmFjaW9uIE8yLCBHQgpiYXNlX2xvZ2l0MiA8LSBiYXNlX2xvZ2l0CmJhc2VfbG9naXQyJExvZ19GQzwtIGxvZyhiYXNlX2xvZ2l0MiRDQ19GQ19JbmdyZXNvKQpiYXNlX2xvZ2l0MiRMb2dfVEFTPC0gbG9nKGJhc2VfbG9naXQyJENDX1RBU19JbmdyZXNvKQpiYXNlX2xvZ2l0MiRMb2dfQ2xDcjwtIGxvZyhiYXNlX2xvZ2l0MiRDbENyKQpiYXNlX2xvZ2l0MiRMb2dfQ0NfU2FPX0luZ3Jlc288LSBsb2coYmFzZV9sb2dpdDIkQ0NfU2FPX0luZ3Jlc28pCmJhc2VfbG9naXQyJExvZ19MYWJfUGxhcTwtIGxvZyhiYXNlX2xvZ2l0MiRMYWJfUGxhcSkKYmFzZV9sb2dpdDIkTG9nX0xhYl9HQjwtIGxvZyhiYXNlX2xvZ2l0MiRMYWJfR0IpCmJhc2VfbG9naXQyJExvZ19QZXNvPC0gbG9nKGJhc2VfbG9naXQyJFBlc28pCmJhc2VfbG9naXQyJERpYXNfU3hfQWRtaXNpb24gPC0gYmFzZV9sb2dpdDIkQ0NfSG9yYXNfU3hfQWRtaXNpb24vMjQKCmJhc2VfbG9naXQyIDwtIGJhc2VfbG9naXQyWywhbmFtZXMoYmFzZV9sb2dpdDIpICVpbiUgYygiQ2xDciIsICJDQ19TYU9fSW5ncmVzbyIsICJMYWJfUGxhcSIsICJMYWJfR0IiLCAiUGVzbyIsICJDQ19Ib3Jhc19TeF9BZG1pc2lvbiIsICJDQ19GQ19JbmdyZXNvIiwgIkNDX1RBU19JbmdyZXNvIildCgpiYXNlX2xvZ2l0MiRDb21wbF9TYW5nX1RvZG9zIDwtIGFzLmZhY3RvcihiYXNlX2xvZ2l0MiRDb21wbF9TYW5nX1RvZG9zKQpsZXZlbHMoYmFzZV9sb2dpdDIkQ29tcGxfU2FuZ19Ub2RvcykgPC0gYygiTm8iLCAiU2kiKQoKI2NvcnJlbW9zIGRldnVlbHRhIGVsIGdyw6FmaWNvCm1fbG9naXRzMiA8LSBnbG0gKENvbXBsX1NhbmdfVG9kb3Mgfi4gLCBkYXRhID0gYmFzZV9sb2dpdDIsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKQpzdHIoYmFzZV9sb2dpdDIpCiMgUHJlZGljdCB0aGUgcHJvYmFiaWxpdHkgKHApIG9mIGRpYWJldGUgcG9zaXRpdml0eQpwcm9iYWJpbGl0aWVzMiA8LSBwcmVkaWN0KG1fbG9naXRzMiwgdHlwZSA9ICJyZXNwb25zZSIpCnByZWRpY3RlZC5jbGFzc2VzMiA8LSBpZmVsc2UocHJvYmFiaWxpdGllczIgPiAwLjMsICJwb3MiLCAibmVnIikKaGVhZChwcmVkaWN0ZWQuY2xhc3NlczIpCgojMSkgUmVtb3ZlIHF1YWxpdGF0aXZlIHZhcmlhYmxlcyBmcm9tIHRoZSBvcmlnaW5hbCBkYXRhIGZyYW1lIGFuZCBiaW5kIHRoZSBsb2dpdCB2YWx1ZXMgdG8gdGhlIGRhdGE6CiMgU2VsZWN0IG9ubHkgbnVtZXJpYyBwcmVkaWN0b3JzCm5vbWJyZXMgPC0gYygiRWRhZCIsICJGcmVjLiByZXNwLiBhbCBpbmdyZXNvIiwgIkhlbW9nbG9iaW5hIiwgIlRBUFNFIiwgIlBTQVAiLCAiTG9nYXJpdG1vIEZDIiwgIkxvZ2FyaXRtbyBUQVMiLCAiTG9nYXJpdG1vIENsQ3IiLCAiTG9nYXJpdG1vIFNhdCBPMiIsICJMb2dhcml0bW8gcGxhcXVldGFzIiwgIkxvZ2FyaXRtbyBHQiIsICJMb2dhcml0bW8gUGVzbyIsICJEaWFzIGRlc2RlIGluaWNpbyBkZSBzaW50b21hcyBoYXN0YSBjb25zdWx0YSIpCgpteWRhdGEyIDwtIGJhc2VfbG9naXQyICU+JQogIGRwbHlyOjpzZWxlY3RfaWYoaXMubnVtZXJpYykgCnByZWRpY3RvcnMgPC0gY29sbmFtZXMobm9tYnJlcykKIyBCaW5kIHRoZSBsb2dpdCBhbmQgdGlkeWluZyB0aGUgZGF0YSBmb3IgcGxvdApteWRhdGEyIDwtIG15ZGF0YTIgJT4lCiAgbXV0YXRlKGxvZ2l0ID0gbG9nKHByb2JhYmlsaXRpZXMyLygxLXByb2JhYmlsaXRpZXMyKSkpICU+JQogIGdhdGhlcihrZXkgPSAicHJlZGljdG9ycyIsIHZhbHVlID0gInByZWRpY3Rvci52YWx1ZSIsIC1sb2dpdCkKCiMyKQpnZ3Bsb3QobXlkYXRhMiwgYWVzKHByZWRpY3Rvci52YWx1ZSwgbG9naXQpKSsKICBnZW9tX3BvaW50KHNpemUgPSAwLjUsIGFscGhhID0gMC41KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIikgKyAKICB0aGVtZV9idygpICsgCiAgZmFjZXRfd3JhcCh+cHJlZGljdG9ycywgc2NhbGVzID0gImZyZWVfeCIpCmBgYAoKPiAgQWwgcmVhbGl6YXIgdHJhc25mb3JtYWNpb25lcyBsb2dhcml0bWljYXMsIHNlIHZlIHF1ZSBzZSByZXNwZXRhIGxhIGxpbmVhbGlkYWQgZGUgbG9zIGxvZ2l0cywgZXhjZXB0byBlbiBsYXMgc2lndWllbnRlcyB2YXJpYWJsZXM6IEdsb2J1bG9zIGJsYW5jb3MsIGZyZWN1ZW5jaWEgY2FyZMOtYWNhLCBmcmVjdWVuY2lhIHJlc3BpcmF0b3JpYSB5IGNsZWFyZW5jZSBkZSBjcmVhdGluaW5hLiBGcmVjdWVuY2lhIHJlc3BpcmF0b3JpYSBubyBzZSBwdWRvIHRyYW5zZm9ybWFyIHBvciBsYSBwcmVzZW5jaWEgZGUgdW4gdmFsb3IgPSAiMCIsIHF1ZSBjb3JyZXNwb25kaWVudGUgYSB1biBwYWNpZW50ZSBlbiBwYXJvIGNhcmRpb3JyZXNwaXJhdG9yaW8uIAoKIyMjIGMpIE11bHRpY29saW5lYWxpZGFkIHkgdmFsb3JlcyBpbmZsdXllbnRlcwoKYGBge3J9CiN2YWxvcmVzIGluZmx1ZW50ZXMKcGxvdChtX2xvZ2l0czIsIHdoaWNoID0gNCwgaWQubiA9IDMpCm1vZGVsLmRhdGEgPC0gYXVnbWVudChtX2xvZ2l0czIpICU+JSBkcGx5cjo6bXV0YXRlKGluZGV4ID0gMTpuKCkpCm1vZGVsLmRhdGEgJT4lIHRvcF9uKDMsIC5jb29rc2QpCmdncGxvdChtb2RlbC5kYXRhLCBhZXMoaW5kZXgsIC5zdGQucmVzaWQpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gbV9sb2dpdHMyJENvbXBsX1NhbmdfVG9kb3MpLCBhbHBoYSA9IC41KSArCiAgdGhlbWVfYncoKQptb2RlbC5kYXRhICU+JSAKICBmaWx0ZXIoYWJzKC5zdGQucmVzaWQpID4gMykKCiNoYXkgdW4gc29sbyB2YWxvciBpbmZsdXllbnRlCgojbXVsdGljb2xpbmVhbGlkYWQKY2FyOjp2aWYobV9sb2dpdHMyKSAjU2UgZXZpZGVuY2lhIG11bHRpY29saW5lYWxpZGFkIGVuIGxhcyB2YXJpYWJsZXMgdHJhbnNmb3JtYWRhcyB5IGVuIGxvcyBzY29yZXMsIHBvciBsbyBjdcOhbCBsb3Mgc2FjYW1vcyB5IHZvbHZlbW9zIGEgZXZhbHVhci4KCmJhc2VfdmlmIDwtIGJhc2VfaW1wWywhbmFtZXMoYmFzZV9pbXApICVpbiUgYygiVEVQX21vdGl2b19pbnQiLCAibWlzcy51bml2IiwiRE9BQ19zaV92c19ubyIsICJQYWNfQ29iZXJ0dXJhIiwgIlBhY19IZW1vcnJhZ2lhX1ByZXZpYV9NYXlvcl9SZWNpZW50ZSIsICJQRVNJY2FsYyIsICJMYWJfQ3IiLCAiSW50X09fQWx0b19SaWVzZ29fQ2FsYyIsICJSSUVURV9DYWxjIiwgIlRMX2N1YWwiLCAiTGFiX1BsYXFfQ29ydGUiLCAiUEVTSV9UYXF1aWNhcmRpYSIsICJQRVNJX1RhcXVpcG5lYSIsICJQRVNJX0hpcG90ZW5zaW9uIiwgIkNDX1NhTzkwIiwgIkVzdFJpZXNnbyIsICJNb3RJbnQiKV0KbV92aWYgPC0gZ2xtIChDb21wbF9TYW5nX1RvZG9zIH4uICwgZGF0YSA9IGJhc2VfdmlmLCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkKY2FyOjp2aWYobV92aWYpCmBgYAoKPi4gU2UgZXZpZGVuY2lhIGNvbGluZWFsaWRhZCBzaWduaWZpY2F0aXZhIGVuIGFsZ3VuYXMgdmFyaWFibGVzIHF1ZSBzb24gbGFzIHF1ZSBzZSB1dGlsaXphbiBwYXJhIGZvcm11bGFyIHNjb3JlcyAoUEVTSSwgUklFVEUpIHkgdGFtYmnDqW4gcGFyYSBDbENyLiBBbCBzYWNhciBlc3RhcyB2YXJpYWJsZXMgdHJhbnNmb3JtYWRhcyB5IHNjb3JlcyBubyB2ZW1vcyBjb2xpbmVhbGlkYWQgc2lnbmlmaWNhdGl2YSwgZXhjZXB0byBwYXJhIGxhcyB2YXJpYWJsZXMgIkFsdGFfVHRvX1RpcG9zX0FDTyIgKFRpcG8gZGUgQUNPIGFsIGFsdGEpLCAiTW90SW50IiAoTW90aXZvIGRlIGludGVybmFjacOzbikgeSBFc3RSaWVzZ28gKEVzdHJhdGlmaWNhY2nDs24gZGUgcmllc2dvIHBvciBFU0MpLiBMbyB0ZW5kcmVtb3MgZW4gY3VlbnRhIGEgbGEgaG9yYSBkZSBzZWxlY2Npb25hciB2YXJpYWJsZXMgcGFyYSBsb3MgbW9kZWxvcyBkZSByZWdyZXNpw7NuLiAKCj4uIFNvbGFtZW50ZSBldmlkZW5jaWFtb3MgMSB2YWxvciBpbmZsdXllbnRlLgoKIyMjIGQpIEFuYWxpc2lzIGRlIHNlbnNpYmlsaWRhZCBwYXJhIGxhcyB2YXJpYWJsZXMgcXVlIG5vIGN1bXBsZW4gY3JpdGVyaW8gZGUgbGluZWFsaWRhZCBkZSBsb2dpdHMKCj4uIEV2YWx1YXJlbW9zIHNpIHNlcGFyYW5kbyBhIGxvcyBwYWNpZW50ZXMgZW4gY3VhcnRpbGVzIG8gdGVyY2lsZXMgcG9kZW1vcyBvYnRlbmVyIHJlbmRpbWllbnRvIGRlIGxhcyB2YXJpYWJsZXMgRlIsIEZDLCBUQVMsIGdsb2J1bG9zIGJsYW5jb3MgeSBjbGVhcmVuY2UgZGUgY3JlYXRpbmluYS4gQWRlbcOhcyBleHBsb3JhcmVtb3MgbGFzIHZhcmlhYmxlcyBwbGFxdWV0YXMgeSBsYSB2YXJpYWJsZSBlZGFkLCBxdWUgbm8gdGllbmVuIHBlbmRpZW50ZSBlbiBsYSBjdXJ2YSBkZSBsb2dpdHMgKGxvIGN1w6FsIGV4cGxpY2EgcXVlIG5vIHNlYW4gc2lnbmlmaWNhdGl2YXMgZW4gdW4gbW9kZWxvIHVuaXZhcmlhZG8pIHBhcmEgdmVyIHNpIGhheSBhbGfDum4gc3ViZ3J1cG8gZG9uZGUgc2UgZXZpZGVuY2llIHJlbGFjacOzbiBjb24gbGEgdmFyaWFibGUgcmVzcHVlc3RhLiAKCiMjIyMgYSkgRWRhZAoKYGBge3J9CmJhc2Vfc2VucyA8LSBiYXNlX2xvZ2l0MgpiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcyA8LSBhcy5mYWN0b3IoYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MpCnN1bW1hcnkoYmFzZV9zZW5zJFBhY19FZGFkKQpiYXNlX3NlbnMkUGFjX0VkYWRfQ29ydGU8LWN1dChiYXNlX3NlbnMkUGFjX0VkYWQsYnJlYWtzPXNlcSgxNiw5NyxsZW5ndGgub3V0PTUpKQp0YWJsZShiYXNlX3NlbnMkUGFjX0VkYWRfQ29ydGUpCgpjbGFzZXNfZWRhZCA8LSBjdXQoYmFzZV9zZW5zJFBhY19FZGFkLGJyZWFrcz1zZXEoMTYsOTcsbGVuZ3RoLm91dD0xMCkpCnRhYmxlKGNsYXNlc19lZGFkKQoKbWVkaWFzX2VkYWQ8LXRhcHBseShiYXNlX3NlbnMkUGFjX0VkYWQsSU5ERVg9Y2xhc2VzX2VkYWQsRlVOPW1lYW4pIAoKYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MgPC0gYXMuaW50ZWdlcihiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcykKc3VtYVlwb3JDbGFzZXNfZWRhZDwtdGFwcGx5KGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zLElOREVYPWNsYXNlc19lZGFkLEZVTj1zdW0pCnN1bWFZcG9yQ2xhc2VzX2VkYWQKCnBFc3RpbWFkb19lZGFkPC1hcy52ZWN0b3Ioc3VtYVlwb3JDbGFzZXNfZWRhZC90YWJsZShjbGFzZXNfZWRhZCkpCnBFc3RpbWFkb19lZGFkIDwtIHBFc3RpbWFkb19lZGFkIC0xCgpsb2dpdF9lZGFkPC1sb2cocEVzdGltYWRvX2VkYWQvKDEtKHBFc3RpbWFkb19lZGFkKSkpCnN0cihsb2dpdF9lZGFkKQoKcGxvdChtZWRpYXNfZWRhZCxsb2dpdF9lZGFkLHhsYWI9Ik1lZGlhIGRlIEVkYWQgcG9yIGNsYXNlIiwKICAgICB5bGFiPSJMb2dpdCBkZSBQcm9iYWJpbGlkYWQgZGUgU2FuZ3JhZG8gcG9yIGNsYXNlIiwKICAgICBtYWluPSAiUHJ1ZWJhIGRlIHJlbGFjacOzbiBsaW5lYWw6IEVkYWQgY29uIExvZ2l0IGRlIHByb2JhYmlsaWRhZCBkZQogICAgIHNhbmdyYWRvIixjb2w9ImJsdWUiLHBjaD0yMCwgdHlwZT0ibG93ZXNzIikKCiMgU2VwYXJvIGVuIHRlcmNpbGVzIHkgaGFnbyBncmFmaWNvcwoKYmFzZV9zZW5zJFBhY19FZGFkX1RlcmMgPC0gbnRpbGUoYmFzZV9zZW5zJFBhY19FZGFkLCAzKSAKY2xhc2VzX2VkYWRfdGVyYzwtYmFzZV9zZW5zJFBhY19FZGFkX1RlcmMKdGFibGUoY2xhc2VzX2VkYWRfdGVyYykgCgptZWRpYXNfZWRhZF90ZXJjPC10YXBwbHkoYmFzZV9zZW5zJFBhY19FZGFkLElOREVYPWNsYXNlc19lZGFkX3RlcmMsRlVOPW1lYW4pIAoKc3VtYVlwb3JDbGFzZXNfZWRhZF90ZXJjPC10YXBwbHkoYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MsSU5ERVg9Y2xhc2VzX2VkYWRfdGVyYyxGVU49c3VtKQpzdW1hWXBvckNsYXNlc19lZGFkX3RlcmMKCnBFc3RpbWFkb19lZGFkX3RlcmM8LWFzLnZlY3RvcihzdW1hWXBvckNsYXNlc19lZGFkX3RlcmMvdGFibGUoY2xhc2VzX2VkYWRfdGVyYykpCnBFc3RpbWFkb19lZGFkX3RlcmMgPC0gcEVzdGltYWRvX2VkYWRfdGVyYyAtMQoKbG9naXRfZWRhZF90ZXJjPC1sb2cocEVzdGltYWRvX2VkYWRfdGVyYy8oMS0ocEVzdGltYWRvX2VkYWRfdGVyYykpKQoKcGxvdChtZWRpYXNfZWRhZF90ZXJjLGxvZ2l0X2VkYWRfdGVyYyx4bGFiPSJNZWRpYSBkZSBFZGFkIHBvciBjbGFzZSIsCiAgICAgeWxhYj0iTG9naXQgZGUgUHJvYmFiaWxpZGFkIGRlIFNhbmdyYWRvIHBvciBjbGFzZSIsCiAgICAgbWFpbj0gIlBydWViYSBkZSByZWxhY2nDs24gbGluZWFsOiBFZGFkIHRlcmNpbGVzIGNvbiBMb2dpdCBkZSBwcm9iYWJpbGlkYWQgZGUKICAgICBzYW5ncmFkbyIsY29sPSJibHVlIixwY2g9MjAsIHR5cGU9Imxvd2VzcyIpCgojIFNlcGFybyBlbiBjdWFydGlsZXMgeSBoYWdvIGdyYWZpY29zIApiYXNlX3NlbnMkUGFjX0VkYWRfQ3VhcnQgPC0gbnRpbGUoYmFzZV9zZW5zJFBhY19FZGFkLCA0KSAKY2xhc2VzX2VkYWRfQ3VhcnQ8LWJhc2Vfc2VucyRQYWNfRWRhZF9DdWFydAp0YWJsZShjbGFzZXNfZWRhZF9DdWFydCkgCgptZWRpYXNfZWRhZF9DdWFydDwtdGFwcGx5KGJhc2Vfc2VucyRQYWNfRWRhZCxJTkRFWD1jbGFzZXNfZWRhZF9DdWFydCxGVU49bWVhbikgCgpzdW1hWXBvckNsYXNlc19lZGFkX0N1YXJ0PC10YXBwbHkoYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MsSU5ERVg9Y2xhc2VzX2VkYWRfQ3VhcnQsRlVOPXN1bSkKc3VtYVlwb3JDbGFzZXNfZWRhZF9DdWFydAoKcEVzdGltYWRvX2VkYWRfQ3VhcnQ8LWFzLnZlY3RvcihzdW1hWXBvckNsYXNlc19lZGFkX0N1YXJ0L3RhYmxlKGNsYXNlc19lZGFkX0N1YXJ0KSkKcEVzdGltYWRvX2VkYWRfQ3VhcnQgPC0gcEVzdGltYWRvX2VkYWRfQ3VhcnQgLTEKCmxvZ2l0X2VkYWRfQ3VhcnQ8LWxvZyhwRXN0aW1hZG9fZWRhZF9DdWFydC8oMS0ocEVzdGltYWRvX2VkYWRfQ3VhcnQpKSkKCnBsb3QobWVkaWFzX2VkYWRfQ3VhcnQsbG9naXRfZWRhZF9DdWFydCx4bGFiPSJNZWRpYSBkZSBFZGFkIHBvciBjbGFzZSIsCiAgICAgeWxhYj0iTG9naXQgZGUgUHJvYmFiaWxpZGFkIGRlIFNhbmdyYWRvIHBvciBjbGFzZSIsCiAgICAgbWFpbj0gIlBydWViYSBkZSByZWxhY2nDs24gbGluZWFsOiBFZGFkIGN1YXJ0aWxlcyBjb24gTG9naXQgZGUgcHJvYmFiaWxpZGFkIGRlCiAgICAgc2FuZ3JhZG8iLGNvbD0iYmx1ZSIscGNoPTIwLCB0eXBlPSJsb3dlc3MiKQoKIyBTZXBhcm8gZW4gcXVpbnRpbGVzIHkgaGFnbyBncmFmaWNvcyAKYmFzZV9zZW5zJFBhY19FZGFkX1F1aW50IDwtIG50aWxlKGJhc2Vfc2VucyRQYWNfRWRhZCwgNSkgCmNsYXNlc19lZGFkX1F1aW50PC1iYXNlX3NlbnMkUGFjX0VkYWRfUXVpbnQKdGFibGUoY2xhc2VzX2VkYWRfUXVpbnQpIAoKbWVkaWFzX2VkYWRfUXVpbnQ8LXRhcHBseShiYXNlX3NlbnMkUGFjX0VkYWQsSU5ERVg9Y2xhc2VzX2VkYWRfUXVpbnQsRlVOPW1lYW4pIAoKc3VtYVlwb3JDbGFzZXNfZWRhZF9RdWludDwtdGFwcGx5KGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zLElOREVYPWNsYXNlc19lZGFkX1F1aW50LEZVTj1zdW0pCnN1bWFZcG9yQ2xhc2VzX2VkYWRfUXVpbnQKCnBFc3RpbWFkb19lZGFkX1F1aW50PC1hcy52ZWN0b3Ioc3VtYVlwb3JDbGFzZXNfZWRhZF9RdWludC90YWJsZShjbGFzZXNfZWRhZF9RdWludCkpCnBFc3RpbWFkb19lZGFkX1F1aW50IDwtIHBFc3RpbWFkb19lZGFkX1F1aW50IC0xCgpsb2dpdF9lZGFkX1F1aW50PC1sb2cocEVzdGltYWRvX2VkYWRfUXVpbnQvKDEtKHBFc3RpbWFkb19lZGFkX1F1aW50KSkpCgpwbG90KG1lZGlhc19lZGFkX1F1aW50LGxvZ2l0X2VkYWRfUXVpbnQseGxhYj0iTWVkaWEgZGUgRWRhZCBwb3IgY2xhc2UiLAogICAgIHlsYWI9IkxvZ2l0IGRlIFByb2JhYmlsaWRhZCBkZSBTYW5ncmFkbyBwb3IgY2xhc2UiLAogICAgIG1haW49ICJQcnVlYmEgZGUgcmVsYWNpw7NuIGxpbmVhbDogRWRhZCBxdWludGlsZXMgY29uIExvZ2l0IGRlIHByb2JhYmlsaWRhZCBkZQogICAgIHNhbmdyYWRvIixjb2w9ImJsdWUiLHBjaD0yMCwgdHlwZT0ibG93ZXNzIikKCiMgU2VwYXJvIGVuIGRvcyB5IGhhZ28gZ3JhZmljb3MgCmJhc2Vfc2VucyRQYWNfRWRhZF9CaW5vbSA8LSBudGlsZShiYXNlX3NlbnMkUGFjX0VkYWQsIDIpIApjbGFzZXNfZWRhZF9CaW5vbTwtYmFzZV9zZW5zJFBhY19FZGFkX0Jpbm9tCnRhYmxlKGNsYXNlc19lZGFkX0Jpbm9tKSAKCm1lZGlhc19lZGFkX0Jpbm9tPC10YXBwbHkoYmFzZV9zZW5zJFBhY19FZGFkLElOREVYPWNsYXNlc19lZGFkX0Jpbm9tLEZVTj1tZWFuKSAKCnN1bWFZcG9yQ2xhc2VzX2VkYWRfQmlub208LXRhcHBseShiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcyxJTkRFWD1jbGFzZXNfZWRhZF9CaW5vbSxGVU49c3VtKQpzdW1hWXBvckNsYXNlc19lZGFkX0Jpbm9tCgpwRXN0aW1hZG9fZWRhZF9CaW5vbTwtYXMudmVjdG9yKHN1bWFZcG9yQ2xhc2VzX2VkYWRfQmlub20vdGFibGUoY2xhc2VzX2VkYWRfQmlub20pKQpwRXN0aW1hZG9fZWRhZF9CaW5vbSA8LSBwRXN0aW1hZG9fZWRhZF9CaW5vbSAtMQoKbG9naXRfZWRhZF9CaW5vbTwtbG9nKHBFc3RpbWFkb19lZGFkX0Jpbm9tLygxLShwRXN0aW1hZG9fZWRhZF9CaW5vbSkpKQoKcGxvdChtZWRpYXNfZWRhZF9CaW5vbSxsb2dpdF9lZGFkX0Jpbm9tLHhsYWI9Ik1lZGlhIGRlIEVkYWQgcG9yIGNsYXNlIiwKICAgICB5bGFiPSJMb2dpdCBkZSBQcm9iYWJpbGlkYWQgZGUgU2FuZ3JhZG8gcG9yIGNsYXNlIiwKICAgICBtYWluPSAiUHJ1ZWJhIGRlIHJlbGFjacOzbiBsaW5lYWw6IEVkYWQgZG9zIGdydXBvcyBjb24gTG9naXQgZGUgcHJvYmFiaWxpZGFkIGRlCiAgICAgc2FuZ3JhZG8iLGNvbD0iYmx1ZSIscGNoPTIwLCB0eXBlPSJsb3dlc3MiKQpgYGAKCiMjIyMgYikgRlIKCmBgYHtyfQpiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcyA8LSBhcy5mYWN0b3IoYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MpCnN1bW1hcnkoYmFzZV9zZW5zJENDX0ZSX0luZ3Jlc28pCmJhc2Vfc2VucyRDQ19GUl9JbmdyZXNvX0NvcnRlPC1jdXQoYmFzZV9zZW5zJENDX0ZSX0luZ3Jlc28sYnJlYWtzPXNlcSgwLDQzLGxlbmd0aC5vdXQ9NSkpCnRhYmxlKGJhc2Vfc2VucyRDQ19GUl9JbmdyZXNvX0NvcnRlKQoKY2xhc2VzX2ZyIDwtIGN1dChiYXNlX3NlbnMkQ0NfRlJfSW5ncmVzbyxicmVha3M9c2VxKDAsNDMsbGVuZ3RoLm91dD0xMCkpCnRhYmxlKGNsYXNlc19mcikKCm1lZGlhc19mcjwtdGFwcGx5KGJhc2Vfc2VucyRDQ19GUl9JbmdyZXNvLElOREVYPWNsYXNlc19mcixGVU49bWVhbikgCgpiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcyA8LSBhcy5pbnRlZ2VyKGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zKQpzdW1hWXBvckNsYXNlc19mcjwtdGFwcGx5KGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zLElOREVYPWNsYXNlc19mcixGVU49c3VtKQpzdW1hWXBvckNsYXNlc19mcgoKcEVzdGltYWRvX2ZyPC1hcy52ZWN0b3Ioc3VtYVlwb3JDbGFzZXNfZnIvdGFibGUoY2xhc2VzX2ZyKSkKcEVzdGltYWRvX2ZyIDwtIHBFc3RpbWFkb19mciAtMQoKbG9naXRfZnI8LWxvZyhwRXN0aW1hZG9fZnIvKDEtKHBFc3RpbWFkb19mcikpKQoKcGxvdChtZWRpYXNfZnIsbG9naXRfZnIseGxhYj0iTWVkaWEgZGUgRlIgcG9yIGNsYXNlIiwKICAgICB5bGFiPSJMb2dpdCBkZSBQcm9iYWJpbGlkYWQgZGUgU2FuZ3JhZG8gcG9yIGNsYXNlIiwKICAgICBtYWluPSAiUHJ1ZWJhIGRlIHJlbGFjacOzbiBsaW5lYWw6IEZSIGNvbiBMb2dpdCBkZSBwcm9iYWJpbGlkYWQgZGUKICAgICBzYW5ncmFkbyIsY29sPSJibHVlIixwY2g9MjAsIHR5cGU9Imxvd2VzcyIpCgojIFNlcGFybyBlbiB0ZXJjaWxlcyB5IGhhZ28gZ3JhZmljb3MKCmJhc2Vfc2VucyRDQ19GUl9JbmdyZXNvX1RlcmMgPC0gbnRpbGUoYmFzZV9zZW5zJENDX0ZSX0luZ3Jlc28sIDMpIApjbGFzZXNfZnJfdGVyYzwtYmFzZV9zZW5zJENDX0ZSX0luZ3Jlc29fVGVyYwp0YWJsZShjbGFzZXNfZnJfdGVyYykgCgptZWRpYXNfZnJfdGVyYzwtdGFwcGx5KGJhc2Vfc2VucyRDQ19GUl9JbmdyZXNvLElOREVYPWNsYXNlc19mcl90ZXJjLEZVTj1tZWFuKSAKCnN1bWFZcG9yQ2xhc2VzX2ZyX3RlcmM8LXRhcHBseShiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcyxJTkRFWD1jbGFzZXNfZnJfdGVyYyxGVU49c3VtKQpzdW1hWXBvckNsYXNlc19mcl90ZXJjCgpwRXN0aW1hZG9fZnJfdGVyYzwtYXMudmVjdG9yKHN1bWFZcG9yQ2xhc2VzX2ZyX3RlcmMvdGFibGUoY2xhc2VzX2ZyX3RlcmMpKQpwRXN0aW1hZG9fZnJfdGVyYyA8LSBwRXN0aW1hZG9fZnJfdGVyYyAtMQoKbG9naXRfZnJfdGVyYzwtbG9nKHBFc3RpbWFkb19mcl90ZXJjLygxLShwRXN0aW1hZG9fZnJfdGVyYykpKQoKcGxvdChtZWRpYXNfZnJfdGVyYyxsb2dpdF9mcl90ZXJjLHhsYWI9Ik1lZGlhIGRlIEZSIHBvciBjbGFzZSIsCiAgICAgeWxhYj0iTG9naXQgZGUgUHJvYmFiaWxpZGFkIGRlIFNhbmdyYWRvIHBvciBjbGFzZSIsCiAgICAgbWFpbj0gIlBydWViYSBkZSByZWxhY2nDs24gbGluZWFsOiBGUiB0ZXJjaWxlcyBjb24gTG9naXQgZGUgcHJvYmFiaWxpZGFkIGRlCiAgICAgc2FuZ3JhZG8iLGNvbD0iYmx1ZSIscGNoPTIwLCB0eXBlPSJsb3dlc3MiKQoKIyBTZXBhcm8gZW4gY3VhcnRpbGVzIHkgaGFnbyBncmFmaWNvcyAKYmFzZV9zZW5zJENDX0ZSX0luZ3Jlc29fQ3VhcnQgPC0gbnRpbGUoYmFzZV9zZW5zJENDX0ZSX0luZ3Jlc28sIDQpIApjbGFzZXNfZnJfQ3VhcnQ8LWJhc2Vfc2VucyRDQ19GUl9JbmdyZXNvX0N1YXJ0CnRhYmxlKGNsYXNlc19mcl9DdWFydCkgCgptZWRpYXNfZnJfQ3VhcnQ8LXRhcHBseShiYXNlX3NlbnMkQ0NfRlJfSW5ncmVzbyxJTkRFWD1jbGFzZXNfZnJfQ3VhcnQsRlVOPW1lYW4pIAoKc3VtYVlwb3JDbGFzZXNfZnJfQ3VhcnQ8LXRhcHBseShiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcyxJTkRFWD1jbGFzZXNfZnJfQ3VhcnQsRlVOPXN1bSkKc3VtYVlwb3JDbGFzZXNfZnJfQ3VhcnQKCnBFc3RpbWFkb19mcl9DdWFydDwtYXMudmVjdG9yKHN1bWFZcG9yQ2xhc2VzX2ZyX0N1YXJ0L3RhYmxlKGNsYXNlc19mcl9DdWFydCkpCnBFc3RpbWFkb19mcl9DdWFydCA8LSBwRXN0aW1hZG9fZnJfQ3VhcnQgLTEKCmxvZ2l0X2ZyX0N1YXJ0PC1sb2cocEVzdGltYWRvX2ZyX0N1YXJ0LygxLShwRXN0aW1hZG9fZnJfQ3VhcnQpKSkKCnBsb3QobWVkaWFzX2ZyX0N1YXJ0LGxvZ2l0X2ZyX0N1YXJ0LHhsYWI9Ik1lZGlhIGRlIEZSIHBvciBjbGFzZSIsCiAgICAgeWxhYj0iTG9naXQgZGUgUHJvYmFiaWxpZGFkIGRlIFNhbmdyYWRvIHBvciBjbGFzZSIsCiAgICAgbWFpbj0gIlBydWViYSBkZSByZWxhY2nDs24gbGluZWFsOiBGUiBjdWFydGlsZXMgY29uIExvZ2l0IGRlIHByb2JhYmlsaWRhZCBkZQogICAgIHNhbmdyYWRvIixjb2w9ImJsdWUiLHBjaD0yMCwgdHlwZT0ibG93ZXNzIikKCiMgU2VwYXJvIGVuIHF1aW50aWxlcyB5IGhhZ28gZ3JhZmljb3MgCmJhc2Vfc2VucyRDQ19GUl9JbmdyZXNvX1F1aW50IDwtIG50aWxlKGJhc2Vfc2VucyRDQ19GUl9JbmdyZXNvLCA1KSAKY2xhc2VzX2ZyX1F1aW50PC1iYXNlX3NlbnMkQ0NfRlJfSW5ncmVzb19RdWludAp0YWJsZShjbGFzZXNfZnJfUXVpbnQpIAoKbWVkaWFzX2ZyX1F1aW50PC10YXBwbHkoYmFzZV9zZW5zJENDX0ZSX0luZ3Jlc28sSU5ERVg9Y2xhc2VzX2ZyX1F1aW50LEZVTj1tZWFuKSAKCnN1bWFZcG9yQ2xhc2VzX2ZyX1F1aW50PC10YXBwbHkoYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MsSU5ERVg9Y2xhc2VzX2ZyX1F1aW50LEZVTj1zdW0pCnN1bWFZcG9yQ2xhc2VzX2ZyX1F1aW50CgpwRXN0aW1hZG9fZnJfUXVpbnQ8LWFzLnZlY3RvcihzdW1hWXBvckNsYXNlc19mcl9RdWludC90YWJsZShjbGFzZXNfZnJfUXVpbnQpKQpwRXN0aW1hZG9fZnJfUXVpbnQgPC0gcEVzdGltYWRvX2ZyX1F1aW50IC0xCgpsb2dpdF9mcl9RdWludDwtbG9nKHBFc3RpbWFkb19mcl9RdWludC8oMS0ocEVzdGltYWRvX2ZyX1F1aW50KSkpCgpwbG90KG1lZGlhc19mcl9RdWludCxsb2dpdF9mcl9RdWludCx4bGFiPSJNZWRpYSBkZSBGUiBwb3IgY2xhc2UiLAogICAgIHlsYWI9IkxvZ2l0IGRlIFByb2JhYmlsaWRhZCBkZSBTYW5ncmFkbyBwb3IgY2xhc2UiLAogICAgIG1haW49ICJQcnVlYmEgZGUgcmVsYWNpw7NuIGxpbmVhbDogRlIgcXVpbnRpbGVzIGNvbiBMb2dpdCBkZSBwcm9iYWJpbGlkYWQgZGUKICAgICBzYW5ncmFkbyIsY29sPSJibHVlIixwY2g9MjAsIHR5cGU9Imxvd2VzcyIpCgojIFNlcGFybyBlbiBkb3MgeSBoYWdvIGdyYWZpY29zIApzdW1tYXJ5KGJhc2Vfc2VucyRDQ19GUl9JbmdyZXNvKQpiYXNlX3NlbnMkQ0NfRlJfSW5ncmVzb19CaW5vbSA8LSBudGlsZShiYXNlX3NlbnMkQ0NfRlJfSW5ncmVzbywgMikgCmNsYXNlc19mcl9CaW5vbTwtYmFzZV9zZW5zJENDX0ZSX0luZ3Jlc29fQmlub20KdGFibGUoY2xhc2VzX2ZyX0Jpbm9tKSAKCm1lZGlhc19mcl9CaW5vbTwtdGFwcGx5KGJhc2Vfc2VucyRDQ19GUl9JbmdyZXNvLElOREVYPWNsYXNlc19mcl9CaW5vbSxGVU49bWVhbikgCgpzdW1hWXBvckNsYXNlc19mcl9CaW5vbTwtdGFwcGx5KGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zLElOREVYPWNsYXNlc19mcl9CaW5vbSxGVU49c3VtKQpzdW1hWXBvckNsYXNlc19mcl9CaW5vbQoKcEVzdGltYWRvX2ZyX0Jpbm9tPC1hcy52ZWN0b3Ioc3VtYVlwb3JDbGFzZXNfZnJfQmlub20vdGFibGUoY2xhc2VzX2ZyX0Jpbm9tKSkKcEVzdGltYWRvX2ZyX0Jpbm9tIDwtIHBFc3RpbWFkb19mcl9CaW5vbSAtMQoKbG9naXRfZnJfQmlub208LWxvZyhwRXN0aW1hZG9fZnJfQmlub20vKDEtKHBFc3RpbWFkb19mcl9CaW5vbSkpKQoKcGxvdChtZWRpYXNfZnJfQmlub20sbG9naXRfZnJfQmlub20seGxhYj0iTWVkaWEgZGUgRlIgcG9yIGNsYXNlIiwKICAgICB5bGFiPSJMb2dpdCBkZSBQcm9iYWJpbGlkYWQgZGUgU2FuZ3JhZG8gcG9yIGNsYXNlIiwKICAgICBtYWluPSAiUHJ1ZWJhIGRlIHJlbGFjacOzbiBsaW5lYWw6IEZSIGRvcyBncnVwb3MgY29uIExvZ2l0IGRlIHByb2JhYmlsaWRhZCBkZQogICAgIHNhbmdyYWRvIixjb2w9ImJsdWUiLHBjaD0yMCwgdHlwZT0ibG93ZXNzIikKYGBgCgojIyMjIGMpIEZDCgpgYGB7cn0KYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MgPC0gYXMuZmFjdG9yKGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zKQpzdW1tYXJ5KGJhc2Vfc2VucyRMb2dfRkMpCmJhc2Vfc2VucyRMb2dfRkNfQ29ydGU8LWN1dChiYXNlX3NlbnMkTG9nX0ZDLGJyZWFrcz1zZXEoMy40LDUuMTksbGVuZ3RoLm91dD01KSkKdGFibGUoYmFzZV9zZW5zJExvZ19GQ19Db3J0ZSkKCmNsYXNlc19GQyA8LSBjdXQoYmFzZV9zZW5zJExvZ19GQyxicmVha3M9c2VxKDMuNCw1LjE5LGxlbmd0aC5vdXQ9MTApKQp0YWJsZShjbGFzZXNfRkMpCgptZWRpYXNfRkM8LXRhcHBseShiYXNlX3NlbnMkTG9nX0ZDLElOREVYPWNsYXNlc19GQyxGVU49bWVhbikgCgpiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcyA8LSBhcy5pbnRlZ2VyKGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zKQpzdW1hWXBvckNsYXNlc19GQzwtdGFwcGx5KGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zLElOREVYPWNsYXNlc19GQyxGVU49c3VtKQpzdW1hWXBvckNsYXNlc19GQwoKcEVzdGltYWRvX0ZDPC1hcy52ZWN0b3Ioc3VtYVlwb3JDbGFzZXNfRkMvdGFibGUoY2xhc2VzX0ZDKSkKcEVzdGltYWRvX0ZDIDwtIHBFc3RpbWFkb19GQyAtMQoKbG9naXRfRkM8LWxvZyhwRXN0aW1hZG9fRkMvKDEtKHBFc3RpbWFkb19GQykpKQoKcGxvdChtZWRpYXNfRkMsbG9naXRfRkMseGxhYj0iTWVkaWEgZGUgRkMgcG9yIGNsYXNlIiwKICAgICB5bGFiPSJMb2dpdCBkZSBQcm9iYWJpbGlkYWQgZGUgU2FuZ3JhZG8gcG9yIGNsYXNlIiwKICAgICBtYWluPSAiUHJ1ZWJhIGRlIHJlbGFjacOzbiBsaW5lYWw6IEZDIGNvbiBMb2dpdCBkZSBwcm9iYWJpbGlkYWQgZGUKICAgICBzYW5ncmFkbyIsY29sPSJibHVlIixwY2g9MjAsIHR5cGU9Imxvd2VzcyIpCgojIFNlcGFybyBlbiB0ZXJjaWxlcyB5IGhhZ28gZ3JhZmljb3MKCmJhc2Vfc2VucyRMb2dfRkNfVGVyYyA8LSBudGlsZShiYXNlX3NlbnMkTG9nX0ZDLCAzKSAKY2xhc2VzX0ZDX3RlcmM8LWJhc2Vfc2VucyRMb2dfRkNfVGVyYwp0YWJsZShjbGFzZXNfRkNfdGVyYykgCgptZWRpYXNfRkNfdGVyYzwtdGFwcGx5KGJhc2Vfc2VucyRMb2dfRkMsSU5ERVg9Y2xhc2VzX0ZDX3RlcmMsRlVOPW1lYW4pIAoKc3VtYVlwb3JDbGFzZXNfRkNfdGVyYzwtdGFwcGx5KGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zLElOREVYPWNsYXNlc19GQ190ZXJjLEZVTj1zdW0pCnN1bWFZcG9yQ2xhc2VzX0ZDX3RlcmMKCnBFc3RpbWFkb19GQ190ZXJjPC1hcy52ZWN0b3Ioc3VtYVlwb3JDbGFzZXNfRkNfdGVyYy90YWJsZShjbGFzZXNfRkNfdGVyYykpCnBFc3RpbWFkb19GQ190ZXJjIDwtIHBFc3RpbWFkb19GQ190ZXJjIC0xCgpsb2dpdF9GQ190ZXJjPC1sb2cocEVzdGltYWRvX0ZDX3RlcmMvKDEtKHBFc3RpbWFkb19GQ190ZXJjKSkpCgpwbG90KG1lZGlhc19GQ190ZXJjLGxvZ2l0X0ZDX3RlcmMseGxhYj0iTWVkaWEgZGUgRkMgcG9yIGNsYXNlIiwKICAgICB5bGFiPSJMb2dpdCBkZSBQcm9iYWJpbGlkYWQgZGUgU2FuZ3JhZG8gcG9yIGNsYXNlIiwKICAgICBtYWluPSAiUHJ1ZWJhIGRlIHJlbGFjacOzbiBsaW5lYWw6IEZDIHRlcmNpbGVzIGNvbiBMb2dpdCBkZSBwcm9iYWJpbGlkYWQgZGUKICAgICBzYW5ncmFkbyIsY29sPSJibHVlIixwY2g9MjAsIHR5cGU9Imxvd2VzcyIpCgojIFNlcGFybyBlbiBjdWFydGlsZXMgeSBoYWdvIGdyYWZpY29zIApiYXNlX3NlbnMkTG9nX0ZDX0N1YXJ0IDwtIG50aWxlKGJhc2Vfc2VucyRMb2dfRkMsIDQpIApjbGFzZXNfRkNfQ3VhcnQ8LWJhc2Vfc2VucyRMb2dfRkNfQ3VhcnQKdGFibGUoY2xhc2VzX0ZDX0N1YXJ0KSAKCm1lZGlhc19GQ19DdWFydDwtdGFwcGx5KGJhc2Vfc2VucyRMb2dfRkMsSU5ERVg9Y2xhc2VzX0ZDX0N1YXJ0LEZVTj1tZWFuKSAKCnN1bWFZcG9yQ2xhc2VzX0ZDX0N1YXJ0PC10YXBwbHkoYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MsSU5ERVg9Y2xhc2VzX0ZDX0N1YXJ0LEZVTj1zdW0pCnN1bWFZcG9yQ2xhc2VzX0ZDX0N1YXJ0CgpwRXN0aW1hZG9fRkNfQ3VhcnQ8LWFzLnZlY3RvcihzdW1hWXBvckNsYXNlc19GQ19DdWFydC90YWJsZShjbGFzZXNfRkNfQ3VhcnQpKQpwRXN0aW1hZG9fRkNfQ3VhcnQgPC0gcEVzdGltYWRvX0ZDX0N1YXJ0IC0xCgpsb2dpdF9GQ19DdWFydDwtbG9nKHBFc3RpbWFkb19GQ19DdWFydC8oMS0ocEVzdGltYWRvX0ZDX0N1YXJ0KSkpCgpwbG90KG1lZGlhc19GQ19DdWFydCxsb2dpdF9GQ19DdWFydCx4bGFiPSJNZWRpYSBkZSBGQyBwb3IgY2xhc2UiLAogICAgIHlsYWI9IkxvZ2l0IGRlIFByb2JhYmlsaWRhZCBkZSBTYW5ncmFkbyBwb3IgY2xhc2UiLAogICAgIG1haW49ICJQcnVlYmEgZGUgcmVsYWNpw7NuIGxpbmVhbDogRkMgY3VhcnRpbGVzIGNvbiBMb2dpdCBkZSBwcm9iYWJpbGlkYWQgZGUKICAgICBzYW5ncmFkbyIsY29sPSJibHVlIixwY2g9MjAsIHR5cGU9Imxvd2VzcyIpCgojIFNlcGFybyBlbiBxdWludGlsZXMgeSBoYWdvIGdyYWZpY29zIApiYXNlX3NlbnMkTG9nX0ZDX1F1aW50IDwtIG50aWxlKGJhc2Vfc2VucyRMb2dfRkMsIDUpIApjbGFzZXNfRkNfUXVpbnQ8LWJhc2Vfc2VucyRMb2dfRkNfUXVpbnQKdGFibGUoY2xhc2VzX0ZDX1F1aW50KSAKCm1lZGlhc19GQ19RdWludDwtdGFwcGx5KGJhc2Vfc2VucyRMb2dfRkMsSU5ERVg9Y2xhc2VzX0ZDX1F1aW50LEZVTj1tZWFuKSAKCnN1bWFZcG9yQ2xhc2VzX0ZDX1F1aW50PC10YXBwbHkoYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MsSU5ERVg9Y2xhc2VzX0ZDX1F1aW50LEZVTj1zdW0pCnN1bWFZcG9yQ2xhc2VzX0ZDX1F1aW50CgpwRXN0aW1hZG9fRkNfUXVpbnQ8LWFzLnZlY3RvcihzdW1hWXBvckNsYXNlc19GQ19RdWludC90YWJsZShjbGFzZXNfRkNfUXVpbnQpKQpwRXN0aW1hZG9fRkNfUXVpbnQgPC0gcEVzdGltYWRvX0ZDX1F1aW50IC0xCgpsb2dpdF9GQ19RdWludDwtbG9nKHBFc3RpbWFkb19GQ19RdWludC8oMS0ocEVzdGltYWRvX0ZDX1F1aW50KSkpCgpwbG90KG1lZGlhc19GQ19RdWludCxsb2dpdF9GQ19RdWludCx4bGFiPSJNZWRpYSBkZSBGQyBwb3IgY2xhc2UiLAogICAgIHlsYWI9IkxvZ2l0IGRlIFByb2JhYmlsaWRhZCBkZSBTYW5ncmFkbyBwb3IgY2xhc2UiLAogICAgIG1haW49ICJQcnVlYmEgZGUgcmVsYWNpw7NuIGxpbmVhbDogRkMgcXVpbnRpbGVzIGNvbiBMb2dpdCBkZSBwcm9iYWJpbGlkYWQgZGUKICAgICBzYW5ncmFkbyIsY29sPSJibHVlIixwY2g9MjAsIHR5cGU9Imxvd2VzcyIpCgojIFNlcGFybyBlbiBkb3MgeSBoYWdvIGdyYWZpY29zIApiYXNlX3NlbnMkTG9nX0ZDX0Jpbm9tIDwtIG50aWxlKGJhc2Vfc2VucyRMb2dfRkMsIDIpIApjbGFzZXNfRkNfQmlub208LWJhc2Vfc2VucyRMb2dfRkNfQmlub20KdGFibGUoY2xhc2VzX0ZDX0Jpbm9tKSAKCm1lZGlhc19GQ19CaW5vbTwtdGFwcGx5KGJhc2Vfc2VucyRMb2dfRkMsSU5ERVg9Y2xhc2VzX0ZDX0Jpbm9tLEZVTj1tZWFuKSAKCnN1bWFZcG9yQ2xhc2VzX0ZDX0Jpbm9tPC10YXBwbHkoYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MsSU5ERVg9Y2xhc2VzX0ZDX0Jpbm9tLEZVTj1zdW0pCnN1bWFZcG9yQ2xhc2VzX0ZDX0Jpbm9tCgpwRXN0aW1hZG9fRkNfQmlub208LWFzLnZlY3RvcihzdW1hWXBvckNsYXNlc19GQ19CaW5vbS90YWJsZShjbGFzZXNfRkNfQmlub20pKQpwRXN0aW1hZG9fRkNfQmlub20gPC0gcEVzdGltYWRvX0ZDX0Jpbm9tIC0xCgpsb2dpdF9GQ19CaW5vbTwtbG9nKHBFc3RpbWFkb19GQ19CaW5vbS8oMS0ocEVzdGltYWRvX0ZDX0Jpbm9tKSkpCgpwbG90KG1lZGlhc19GQ19CaW5vbSxsb2dpdF9GQ19CaW5vbSx4bGFiPSJNZWRpYSBkZSBGQyBwb3IgY2xhc2UiLAogICAgIHlsYWI9IkxvZ2l0IGRlIFByb2JhYmlsaWRhZCBkZSBTYW5ncmFkbyBwb3IgY2xhc2UiLAogICAgIG1haW49ICJQcnVlYmEgZGUgcmVsYWNpw7NuIGxpbmVhbDogRkMgZG9zIGdydXBvcyBjb24gTG9naXQgZGUgcHJvYmFiaWxpZGFkIGRlCiAgICAgc2FuZ3JhZG8iLGNvbD0iYmx1ZSIscGNoPTIwLCB0eXBlPSJsb3dlc3MiKQpgYGAKCiMjIyMgZCkgVEFTCgpgYGB7cn0KYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MgPC0gYXMuZmFjdG9yKGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zKQpzdW1tYXJ5KGJhc2Vfc2VucyRMb2dfVEFTKQpiYXNlX3NlbnMkTG9nX1RBU19Db3J0ZTwtY3V0KGJhc2Vfc2VucyRMb2dfVEFTLGJyZWFrcz1zZXEoMy45MSw1LjM5LGxlbmd0aC5vdXQ9NSkpCnRhYmxlKGJhc2Vfc2VucyRMb2dfVEFTX0NvcnRlKQoKY2xhc2VzX1RBUyA8LSBjdXQoYmFzZV9zZW5zJExvZ19UQVMsYnJlYWtzPXNlcSgzLjkxLDUuMzksbGVuZ3RoLm91dD0xMCkpCnRhYmxlKGNsYXNlc19UQVMpCgptZWRpYXNfVEFTPC10YXBwbHkoYmFzZV9zZW5zJExvZ19UQVMsSU5ERVg9Y2xhc2VzX1RBUyxGVU49bWVhbikgCgpiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcyA8LSBhcy5pbnRlZ2VyKGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zKQpzdW1hWXBvckNsYXNlc19UQVM8LXRhcHBseShiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcyxJTkRFWD1jbGFzZXNfVEFTLEZVTj1zdW0pCnN1bWFZcG9yQ2xhc2VzX1RBUwoKcEVzdGltYWRvX1RBUzwtYXMudmVjdG9yKHN1bWFZcG9yQ2xhc2VzX1RBUy90YWJsZShjbGFzZXNfVEFTKSkKcEVzdGltYWRvX1RBUyA8LSBwRXN0aW1hZG9fVEFTIC0xCgpsb2dpdF9UQVM8LWxvZyhwRXN0aW1hZG9fVEFTLygxLShwRXN0aW1hZG9fVEFTKSkpCgpwbG90KG1lZGlhc19UQVMsbG9naXRfVEFTLHhsYWI9Ik1lZGlhIGRlIFRBUyBwb3IgY2xhc2UiLAogICAgIHlsYWI9IkxvZ2l0IGRlIFByb2JhYmlsaWRhZCBkZSBTYW5ncmFkbyBwb3IgY2xhc2UiLAogICAgIG1haW49ICJQcnVlYmEgZGUgcmVsYWNpw7NuIGxpbmVhbDogVEFTIGNvbiBMb2dpdCBkZSBwcm9iYWJpbGlkYWQgZGUKICAgICBzYW5ncmFkbyIsY29sPSJibHVlIixwY2g9MjAsIHR5cGU9Imxvd2VzcyIpCgojIFNlcGFybyBlbiB0ZXJjaWxlcyB5IGhhZ28gZ3JhZmljb3MKCmJhc2Vfc2VucyRMb2dfVEFTX1RlcmMgPC0gbnRpbGUoYmFzZV9zZW5zJExvZ19UQVMsIDMpIApjbGFzZXNfVEFTX3RlcmM8LWJhc2Vfc2VucyRMb2dfVEFTX1RlcmMKdGFibGUoY2xhc2VzX1RBU190ZXJjKSAKCm1lZGlhc19UQVNfdGVyYzwtdGFwcGx5KGJhc2Vfc2VucyRMb2dfVEFTLElOREVYPWNsYXNlc19UQVNfdGVyYyxGVU49bWVhbikgCgpzdW1hWXBvckNsYXNlc19UQVNfdGVyYzwtdGFwcGx5KGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zLElOREVYPWNsYXNlc19UQVNfdGVyYyxGVU49c3VtKQpzdW1hWXBvckNsYXNlc19UQVNfdGVyYwoKcEVzdGltYWRvX1RBU190ZXJjPC1hcy52ZWN0b3Ioc3VtYVlwb3JDbGFzZXNfVEFTX3RlcmMvdGFibGUoY2xhc2VzX1RBU190ZXJjKSkKcEVzdGltYWRvX1RBU190ZXJjIDwtIHBFc3RpbWFkb19UQVNfdGVyYyAtMQoKbG9naXRfVEFTX3RlcmM8LWxvZyhwRXN0aW1hZG9fVEFTX3RlcmMvKDEtKHBFc3RpbWFkb19UQVNfdGVyYykpKQoKcGxvdChtZWRpYXNfVEFTX3RlcmMsbG9naXRfVEFTX3RlcmMseGxhYj0iTWVkaWEgZGUgVEFTIHBvciBjbGFzZSIsCiAgICAgeWxhYj0iTG9naXQgZGUgUHJvYmFiaWxpZGFkIGRlIFNhbmdyYWRvIHBvciBjbGFzZSIsCiAgICAgbWFpbj0gIlBydWViYSBkZSByZWxhY2nDs24gbGluZWFsOiBUQVMgdGVyY2lsZXMgY29uIExvZ2l0IGRlIHByb2JhYmlsaWRhZCBkZQogICAgIHNhbmdyYWRvIixjb2w9ImJsdWUiLHBjaD0yMCwgdHlwZT0ibG93ZXNzIikKCiMgU2VwYXJvIGVuIGN1YXJ0aWxlcyB5IGhhZ28gZ3JhZmljb3MgCmJhc2Vfc2VucyRMb2dfVEFTX0N1YXJ0IDwtIG50aWxlKGJhc2Vfc2VucyRMb2dfVEFTLCA0KSAKY2xhc2VzX1RBU19DdWFydDwtYmFzZV9zZW5zJExvZ19UQVNfQ3VhcnQKdGFibGUoY2xhc2VzX1RBU19DdWFydCkgCgptZWRpYXNfVEFTX0N1YXJ0PC10YXBwbHkoYmFzZV9zZW5zJExvZ19UQVMsSU5ERVg9Y2xhc2VzX1RBU19DdWFydCxGVU49bWVhbikgCgpzdW1hWXBvckNsYXNlc19UQVNfQ3VhcnQ8LXRhcHBseShiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcyxJTkRFWD1jbGFzZXNfVEFTX0N1YXJ0LEZVTj1zdW0pCnN1bWFZcG9yQ2xhc2VzX1RBU19DdWFydAoKcEVzdGltYWRvX1RBU19DdWFydDwtYXMudmVjdG9yKHN1bWFZcG9yQ2xhc2VzX1RBU19DdWFydC90YWJsZShjbGFzZXNfVEFTX0N1YXJ0KSkKcEVzdGltYWRvX1RBU19DdWFydCA8LSBwRXN0aW1hZG9fVEFTX0N1YXJ0IC0xCgpsb2dpdF9UQVNfQ3VhcnQ8LWxvZyhwRXN0aW1hZG9fVEFTX0N1YXJ0LygxLShwRXN0aW1hZG9fVEFTX0N1YXJ0KSkpCgpwbG90KG1lZGlhc19UQVNfQ3VhcnQsbG9naXRfVEFTX0N1YXJ0LHhsYWI9Ik1lZGlhIGRlIFRBUyBwb3IgY2xhc2UiLAogICAgIHlsYWI9IkxvZ2l0IGRlIFByb2JhYmlsaWRhZCBkZSBTYW5ncmFkbyBwb3IgY2xhc2UiLAogICAgIG1haW49ICJQcnVlYmEgZGUgcmVsYWNpw7NuIGxpbmVhbDogVEFTIGN1YXJ0aWxlcyBjb24gTG9naXQgZGUgcHJvYmFiaWxpZGFkIGRlCiAgICAgc2FuZ3JhZG8iLGNvbD0iYmx1ZSIscGNoPTIwLCB0eXBlPSJsb3dlc3MiKQoKIyBTZXBhcm8gZW4gcXVpbnRpbGVzIHkgaGFnbyBncmFmaWNvcyAKYmFzZV9zZW5zJExvZ19UQVNfUXVpbnQgPC0gbnRpbGUoYmFzZV9zZW5zJExvZ19UQVMsIDUpIApjbGFzZXNfVEFTX1F1aW50PC1iYXNlX3NlbnMkTG9nX1RBU19RdWludAp0YWJsZShjbGFzZXNfVEFTX1F1aW50KSAKCm1lZGlhc19UQVNfUXVpbnQ8LXRhcHBseShiYXNlX3NlbnMkTG9nX1RBUyxJTkRFWD1jbGFzZXNfVEFTX1F1aW50LEZVTj1tZWFuKSAKCnN1bWFZcG9yQ2xhc2VzX1RBU19RdWludDwtdGFwcGx5KGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zLElOREVYPWNsYXNlc19UQVNfUXVpbnQsRlVOPXN1bSkKc3VtYVlwb3JDbGFzZXNfVEFTX1F1aW50CgpwRXN0aW1hZG9fVEFTX1F1aW50PC1hcy52ZWN0b3Ioc3VtYVlwb3JDbGFzZXNfVEFTX1F1aW50L3RhYmxlKGNsYXNlc19UQVNfUXVpbnQpKQpwRXN0aW1hZG9fVEFTX1F1aW50IDwtIHBFc3RpbWFkb19UQVNfUXVpbnQgLTEKCmxvZ2l0X1RBU19RdWludDwtbG9nKHBFc3RpbWFkb19UQVNfUXVpbnQvKDEtKHBFc3RpbWFkb19UQVNfUXVpbnQpKSkKCnBsb3QobWVkaWFzX1RBU19RdWludCxsb2dpdF9UQVNfUXVpbnQseGxhYj0iTWVkaWEgZGUgVEFTIHBvciBjbGFzZSIsCiAgICAgeWxhYj0iTG9naXQgZGUgUHJvYmFiaWxpZGFkIGRlIFNhbmdyYWRvIHBvciBjbGFzZSIsCiAgICAgbWFpbj0gIlBydWViYSBkZSByZWxhY2nDs24gbGluZWFsOiBUQVMgcXVpbnRpbGVzIGNvbiBMb2dpdCBkZSBwcm9iYWJpbGlkYWQgZGUKICAgICBzYW5ncmFkbyIsY29sPSJibHVlIixwY2g9MjAsIHR5cGU9Imxvd2VzcyIpCgojIFNlcGFybyBlbiBkb3MgeSBoYWdvIGdyYWZpY29zIApiYXNlX3NlbnMkTG9nX1RBU19CaW5vbSA8LSBudGlsZShiYXNlX3NlbnMkTG9nX1RBUywgMikgCmNsYXNlc19UQVNfQmlub208LWJhc2Vfc2VucyRMb2dfVEFTX0Jpbm9tCnRhYmxlKGNsYXNlc19UQVNfQmlub20pIAoKbWVkaWFzX1RBU19CaW5vbTwtdGFwcGx5KGJhc2Vfc2VucyRMb2dfVEFTLElOREVYPWNsYXNlc19UQVNfQmlub20sRlVOPW1lYW4pIAoKc3VtYVlwb3JDbGFzZXNfVEFTX0Jpbm9tPC10YXBwbHkoYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MsSU5ERVg9Y2xhc2VzX1RBU19CaW5vbSxGVU49c3VtKQpzdW1hWXBvckNsYXNlc19UQVNfQmlub20KCnBFc3RpbWFkb19UQVNfQmlub208LWFzLnZlY3RvcihzdW1hWXBvckNsYXNlc19UQVNfQmlub20vdGFibGUoY2xhc2VzX1RBU19CaW5vbSkpCnBFc3RpbWFkb19UQVNfQmlub20gPC0gcEVzdGltYWRvX1RBU19CaW5vbSAtMQoKbG9naXRfVEFTX0Jpbm9tPC1sb2cocEVzdGltYWRvX1RBU19CaW5vbS8oMS0ocEVzdGltYWRvX1RBU19CaW5vbSkpKQoKcGxvdChtZWRpYXNfVEFTX0Jpbm9tLGxvZ2l0X1RBU19CaW5vbSx4bGFiPSJNZWRpYSBkZSBUQVMgcG9yIGNsYXNlIiwKICAgICB5bGFiPSJMb2dpdCBkZSBQcm9iYWJpbGlkYWQgZGUgU2FuZ3JhZG8gcG9yIGNsYXNlIiwKICAgICBtYWluPSAiUHJ1ZWJhIGRlIHJlbGFjacOzbiBsaW5lYWw6IENyIGRvcyBncnVwb3MgY29uIExvZ2l0IGRlIHByb2JhYmlsaWRhZCBkZQogICAgIHNhbmdyYWRvIixjb2w9ImJsdWUiLHBjaD0yMCwgdHlwZT0ibG93ZXNzIikKYGBgCgoKIyMjIyBlKSBQbGFxdWV0YXMKCmBgYHtyfQpiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcyA8LSBhcy5mYWN0b3IoYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MpCnN1bW1hcnkoYmFzZV9zZW5zJExvZ19MYWJfUGxhcSkKYmFzZV9zZW5zJExvZ19MYWJfUGxhcV9Db3J0ZTwtY3V0KGJhc2Vfc2VucyRMb2dfTGFiX1BsYXEsYnJlYWtzPXNlcSgxNS40Miw1Ny4zMyxsZW5ndGgub3V0PTUpKQp0YWJsZShiYXNlX3NlbnMkTG9nX0xhYl9QbGFxX0NvcnRlKQoKY2xhc2VzX0xvZ19MYWJfUGxhcSA8LSBjdXQoYmFzZV9zZW5zJExvZ19MYWJfUGxhcSxicmVha3M9c2VxKDE1LjQyLDU3LjMzLGxlbmd0aC5vdXQ9MTApKQp0YWJsZShjbGFzZXNfTG9nX0xhYl9QbGFxKQoKbWVkaWFzX0xvZ19MYWJfUGxhcTwtdGFwcGx5KGJhc2Vfc2VucyRMb2dfTGFiX1BsYXEsSU5ERVg9Y2xhc2VzX0xvZ19MYWJfUGxhcSxGVU49bWVhbikgCgpiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcyA8LSBhcy5pbnRlZ2VyKGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zKQpzdW1hWXBvckNsYXNlc19Mb2dfTGFiX1BsYXE8LXRhcHBseShiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcyxJTkRFWD1jbGFzZXNfTG9nX0xhYl9QbGFxLEZVTj1zdW0pCnN1bWFZcG9yQ2xhc2VzX0xvZ19MYWJfUGxhcQoKcEVzdGltYWRvX0xvZ19MYWJfUGxhcTwtYXMudmVjdG9yKHN1bWFZcG9yQ2xhc2VzX0xvZ19MYWJfUGxhcS90YWJsZShjbGFzZXNfTG9nX0xhYl9QbGFxKSkKcEVzdGltYWRvX0xvZ19MYWJfUGxhcSA8LSBwRXN0aW1hZG9fTG9nX0xhYl9QbGFxIC0xCgpsb2dpdF9Mb2dfTGFiX1BsYXE8LWxvZyhwRXN0aW1hZG9fTG9nX0xhYl9QbGFxLygxLShwRXN0aW1hZG9fTG9nX0xhYl9QbGFxKSkpCgojIFNlcGFybyBlbiB0ZXJjaWxlcyB5IGhhZ28gZ3JhZmljb3MKCmJhc2Vfc2VucyRMb2dfTGFiX1BsYXFfVGVyYyA8LSBudGlsZShiYXNlX3NlbnMkTG9nX0xhYl9QbGFxLCAzKSAKY2xhc2VzX0xvZ19MYWJfUGxhcV90ZXJjPC1iYXNlX3NlbnMkTG9nX0xhYl9QbGFxX1RlcmMKdGFibGUoY2xhc2VzX0xvZ19MYWJfUGxhcV90ZXJjKSAKCm1lZGlhc19Mb2dfTGFiX1BsYXFfdGVyYzwtdGFwcGx5KGJhc2Vfc2VucyRMb2dfTGFiX1BsYXEsSU5ERVg9Y2xhc2VzX0xvZ19MYWJfUGxhcV90ZXJjLEZVTj1tZWFuKSAKCnN1bWFZcG9yQ2xhc2VzX0xvZ19MYWJfUGxhcV90ZXJjPC10YXBwbHkoYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MsSU5ERVg9Y2xhc2VzX0xvZ19MYWJfUGxhcV90ZXJjLEZVTj1zdW0pCnN1bWFZcG9yQ2xhc2VzX0xvZ19MYWJfUGxhcV90ZXJjCgpwRXN0aW1hZG9fTG9nX0xhYl9QbGFxX3RlcmM8LWFzLnZlY3RvcihzdW1hWXBvckNsYXNlc19Mb2dfTGFiX1BsYXFfdGVyYy90YWJsZShjbGFzZXNfTG9nX0xhYl9QbGFxX3RlcmMpKQpwRXN0aW1hZG9fTG9nX0xhYl9QbGFxX3RlcmMgPC0gcEVzdGltYWRvX0xvZ19MYWJfUGxhcV90ZXJjIC0xCgpsb2dpdF9Mb2dfTGFiX1BsYXFfdGVyYzwtbG9nKHBFc3RpbWFkb19Mb2dfTGFiX1BsYXFfdGVyYy8oMS0ocEVzdGltYWRvX0xvZ19MYWJfUGxhcV90ZXJjKSkpCgpwbG90KG1lZGlhc19Mb2dfTGFiX1BsYXFfdGVyYyxsb2dpdF9Mb2dfTGFiX1BsYXFfdGVyYyx4bGFiPSJNZWRpYSBkZSBQbGFxdWV0YXMgcG9yIGNsYXNlIiwKICAgICB5bGFiPSJMb2dpdCBkZSBQcm9iYWJpbGlkYWQgZGUgU2FuZ3JhZG8gcG9yIGNsYXNlIiwKICAgICBtYWluPSAiUHJ1ZWJhIGRlIHJlbGFjacOzbiBsaW5lYWw6IFBsYXF1ZXRhcyB0ZXJjaWxlcyBjb24gTG9naXQgZGUgcHJvYmFiaWxpZGFkIGRlCiAgICAgc2FuZ3JhZG8iLGNvbD0iYmx1ZSIscGNoPTIwLCB0eXBlPSJsb3dlc3MiKQoKIyBTZXBhcm8gZW4gY3VhcnRpbGVzIHkgaGFnbyBncmFmaWNvcyAKYmFzZV9zZW5zJExvZ19MYWJfUGxhcV9DdWFydCA8LSBudGlsZShiYXNlX3NlbnMkTG9nX0xhYl9QbGFxLCA0KSAKY2xhc2VzX0xvZ19MYWJfUGxhcV9DdWFydDwtYmFzZV9zZW5zJExvZ19MYWJfUGxhcV9DdWFydAp0YWJsZShjbGFzZXNfTG9nX0xhYl9QbGFxX0N1YXJ0KSAKCm1lZGlhc19Mb2dfTGFiX1BsYXFfQ3VhcnQ8LXRhcHBseShiYXNlX3NlbnMkTG9nX0xhYl9QbGFxLElOREVYPWNsYXNlc19Mb2dfTGFiX1BsYXFfQ3VhcnQsRlVOPW1lYW4pIAoKc3VtYVlwb3JDbGFzZXNfTG9nX0xhYl9QbGFxX0N1YXJ0PC10YXBwbHkoYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MsSU5ERVg9Y2xhc2VzX0xvZ19MYWJfUGxhcV9DdWFydCxGVU49c3VtKQpzdW1hWXBvckNsYXNlc19Mb2dfTGFiX1BsYXFfQ3VhcnQKCnBFc3RpbWFkb19Mb2dfTGFiX1BsYXFfQ3VhcnQ8LWFzLnZlY3RvcihzdW1hWXBvckNsYXNlc19Mb2dfTGFiX1BsYXFfQ3VhcnQvdGFibGUoY2xhc2VzX0xvZ19MYWJfUGxhcV9DdWFydCkpCnBFc3RpbWFkb19Mb2dfTGFiX1BsYXFfQ3VhcnQgPC0gcEVzdGltYWRvX0xvZ19MYWJfUGxhcV9DdWFydCAtMQoKbG9naXRfTG9nX0xhYl9QbGFxX0N1YXJ0PC1sb2cocEVzdGltYWRvX0xvZ19MYWJfUGxhcV9DdWFydC8oMS0ocEVzdGltYWRvX0xvZ19MYWJfUGxhcV9DdWFydCkpKQoKcGxvdChtZWRpYXNfTG9nX0xhYl9QbGFxX0N1YXJ0LGxvZ2l0X0xvZ19MYWJfUGxhcV9DdWFydCx4bGFiPSJNZWRpYSBkZSBQbGFxdWV0YXMgcG9yIGNsYXNlIiwKICAgICB5bGFiPSJMb2dpdCBkZSBQcm9iYWJpbGlkYWQgZGUgU2FuZ3JhZG8gcG9yIGNsYXNlIiwKICAgICBtYWluPSAiUHJ1ZWJhIGRlIHJlbGFjacOzbiBsaW5lYWw6IFBsYXF1ZXRhcyBjdWFydGlsZXMgY29uIExvZ2l0IGRlIHByb2JhYmlsaWRhZCBkZQogICAgIHNhbmdyYWRvIixjb2w9ImJsdWUiLHBjaD0yMCwgdHlwZT0ibG93ZXNzIikKCiMgU2VwYXJvIGVuIHF1aW50aWxlcyB5IGhhZ28gZ3JhZmljb3MgCmJhc2Vfc2VucyRMb2dfTGFiX1BsYXFfUXVpbnQgPC0gbnRpbGUoYmFzZV9zZW5zJExvZ19MYWJfUGxhcSwgNSkgCmNsYXNlc19Mb2dfTGFiX1BsYXFfUXVpbnQ8LWJhc2Vfc2VucyRMb2dfTGFiX1BsYXFfUXVpbnQKdGFibGUoY2xhc2VzX0xvZ19MYWJfUGxhcV9RdWludCkgCgptZWRpYXNfTG9nX0xhYl9QbGFxX1F1aW50PC10YXBwbHkoYmFzZV9zZW5zJExvZ19MYWJfUGxhcSxJTkRFWD1jbGFzZXNfTG9nX0xhYl9QbGFxX1F1aW50LEZVTj1tZWFuKSAKCnN1bWFZcG9yQ2xhc2VzX0xvZ19MYWJfUGxhcV9RdWludDwtdGFwcGx5KGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zLElOREVYPWNsYXNlc19Mb2dfTGFiX1BsYXFfUXVpbnQsRlVOPXN1bSkKc3VtYVlwb3JDbGFzZXNfTG9nX0xhYl9QbGFxX1F1aW50CgpwRXN0aW1hZG9fTG9nX0xhYl9QbGFxX1F1aW50PC1hcy52ZWN0b3Ioc3VtYVlwb3JDbGFzZXNfTG9nX0xhYl9QbGFxX1F1aW50L3RhYmxlKGNsYXNlc19Mb2dfTGFiX1BsYXFfUXVpbnQpKQpwRXN0aW1hZG9fTG9nX0xhYl9QbGFxX1F1aW50IDwtIHBFc3RpbWFkb19Mb2dfTGFiX1BsYXFfUXVpbnQgLTEKCmxvZ2l0X0xvZ19MYWJfUGxhcV9RdWludDwtbG9nKHBFc3RpbWFkb19Mb2dfTGFiX1BsYXFfUXVpbnQvKDEtKHBFc3RpbWFkb19Mb2dfTGFiX1BsYXFfUXVpbnQpKSkKCnBsb3QobWVkaWFzX0xvZ19MYWJfUGxhcV9RdWludCxsb2dpdF9Mb2dfTGFiX1BsYXFfUXVpbnQseGxhYj0iTWVkaWEgZGUgUGxhcXVldGFzIHBvciBjbGFzZSIsCiAgICAgeWxhYj0iTG9naXQgZGUgUHJvYmFiaWxpZGFkIGRlIFNhbmdyYWRvIHBvciBjbGFzZSIsCiAgICAgbWFpbj0gIlBydWViYSBkZSByZWxhY2nDs24gbGluZWFsOiBQbGFxdWV0YXMgcXVpbnRpbGVzIGNvbiBMb2dpdCBkZSBwcm9iYWJpbGlkYWQgZGUKICAgICBzYW5ncmFkbyIsY29sPSJibHVlIixwY2g9MjAsIHR5cGU9Imxvd2VzcyIpCgojIFNlcGFybyBlbiBkb3MgeSBoYWdvIGdyYWZpY29zIApiYXNlX3NlbnMkTG9nX0xhYl9QbGFxX0Jpbm9tIDwtIG50aWxlKGJhc2Vfc2VucyRMb2dfTGFiX1BsYXEsIDIpIApjbGFzZXNfTG9nX0xhYl9QbGFxX0Jpbm9tPC1iYXNlX3NlbnMkTG9nX0xhYl9QbGFxX0Jpbm9tCnRhYmxlKGNsYXNlc19Mb2dfTGFiX1BsYXFfQmlub20pIAoKbWVkaWFzX0xvZ19MYWJfUGxhcV9CaW5vbTwtdGFwcGx5KGJhc2Vfc2VucyRMb2dfTGFiX1BsYXEsSU5ERVg9Y2xhc2VzX0xvZ19MYWJfUGxhcV9CaW5vbSxGVU49bWVhbikgCgpzdW1hWXBvckNsYXNlc19Mb2dfTGFiX1BsYXFfQmlub208LXRhcHBseShiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcyxJTkRFWD1jbGFzZXNfTG9nX0xhYl9QbGFxX0Jpbm9tLEZVTj1zdW0pCnN1bWFZcG9yQ2xhc2VzX0xvZ19MYWJfUGxhcV9CaW5vbQoKcEVzdGltYWRvX0xvZ19MYWJfUGxhcV9CaW5vbTwtYXMudmVjdG9yKHN1bWFZcG9yQ2xhc2VzX0xvZ19MYWJfUGxhcV9CaW5vbS90YWJsZShjbGFzZXNfTG9nX0xhYl9QbGFxX0Jpbm9tKSkKcEVzdGltYWRvX0xvZ19MYWJfUGxhcV9CaW5vbSA8LSBwRXN0aW1hZG9fTG9nX0xhYl9QbGFxX0Jpbm9tIC0xCgpsb2dpdF9Mb2dfTGFiX1BsYXFfQmlub208LWxvZyhwRXN0aW1hZG9fTG9nX0xhYl9QbGFxX0Jpbm9tLygxLShwRXN0aW1hZG9fTG9nX0xhYl9QbGFxX0Jpbm9tKSkpCgpwbG90KG1lZGlhc19Mb2dfTGFiX1BsYXFfQmlub20sbG9naXRfTG9nX0xhYl9QbGFxX0Jpbm9tLHhsYWI9Ik1lZGlhIGRlIFBsYXF1ZXRhcyBwb3IgY2xhc2UiLAogICAgIHlsYWI9IkxvZ2l0IGRlIFByb2JhYmlsaWRhZCBkZSBTYW5ncmFkbyBwb3IgY2xhc2UiLAogICAgIG1haW49ICJQcnVlYmEgZGUgcmVsYWNpw7NuIGxpbmVhbDogUGxhcXVldGFzIGRvcyBncnVwb3MgY29uIExvZ2l0IGRlIHByb2JhYmlsaWRhZCBkZQogICAgIHNhbmdyYWRvIixjb2w9ImJsdWUiLHBjaD0yMCwgdHlwZT0ibG93ZXNzIikKYGBgCgojIyMjIGYpIEdsb2J1bG9zIGJsYW5jb3MgKEdCKQoKYGBge3J9CmJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zIDwtIGFzLmZhY3RvcihiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcykKc3VtbWFyeShiYXNlX3NlbnMkTG9nX0xhYl9HQikKYmFzZV9zZW5zJExvZ19MYWJfR0JfQ29ydGU8LWN1dChiYXNlX3NlbnMkTG9nX0xhYl9HQixicmVha3M9c2VxKDcuMDMsMTEuNTksbGVuZ3RoLm91dD01KSkKdGFibGUoYmFzZV9zZW5zJExvZ19MYWJfR0JfQ29ydGUpCgpjbGFzZXNfR0IgPC0gY3V0KGJhc2Vfc2VucyRMb2dfTGFiX0dCLGJyZWFrcz1zZXEoNy4wMywxMS41OSxsZW5ndGgub3V0PTEwKSkKdGFibGUoY2xhc2VzX0dCKQoKbWVkaWFzX0dCPC10YXBwbHkoYmFzZV9zZW5zJExvZ19MYWJfR0IsSU5ERVg9Y2xhc2VzX0dCLEZVTj1tZWFuKSAKCmJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zIDwtIGFzLmludGVnZXIoYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MpCnN1bWFZcG9yQ2xhc2VzX0dCPC10YXBwbHkoYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MsSU5ERVg9Y2xhc2VzX0dCLEZVTj1zdW0pCnN1bWFZcG9yQ2xhc2VzX0dCCgpwRXN0aW1hZG9fR0I8LWFzLnZlY3RvcihzdW1hWXBvckNsYXNlc19HQi90YWJsZShjbGFzZXNfR0IpKQpwRXN0aW1hZG9fR0IgPC0gcEVzdGltYWRvX0dCIC0xCgpsb2dpdF9HQjwtbG9nKHBFc3RpbWFkb19HQi8oMS0ocEVzdGltYWRvX0dCKSkpCgpwbG90KG1lZGlhc19HQixsb2dpdF9HQix4bGFiPSJNZWRpYSBkZSBHQiBwb3IgY2xhc2UiLAogICAgIHlsYWI9IkxvZ2l0IGRlIFByb2JhYmlsaWRhZCBkZSBTYW5ncmFkbyBwb3IgY2xhc2UiLAogICAgIG1haW49ICJQcnVlYmEgZGUgcmVsYWNpw7NuIGxpbmVhbDogR0IgY29uIExvZ2l0IGRlIHByb2JhYmlsaWRhZCBkZQogICAgIHNhbmdyYWRvIixjb2w9ImJsdWUiLHBjaD0yMCwgdHlwZT0ibG93ZXNzIikKCiMgU2VwYXJvIGVuIHRlcmNpbGVzIHkgaGFnbyBncmFmaWNvcwoKYmFzZV9zZW5zJExvZ19MYWJfR0JfVGVyYyA8LSBudGlsZShiYXNlX3NlbnMkTG9nX0xhYl9HQiwgMykgCmNsYXNlc19HQl90ZXJjPC1iYXNlX3NlbnMkTG9nX0xhYl9HQl9UZXJjCnRhYmxlKGNsYXNlc19HQl90ZXJjKSAKCm1lZGlhc19HQl90ZXJjPC10YXBwbHkoYmFzZV9zZW5zJExvZ19MYWJfR0IsSU5ERVg9Y2xhc2VzX0dCX3RlcmMsRlVOPW1lYW4pIAoKc3VtYVlwb3JDbGFzZXNfR0JfdGVyYzwtdGFwcGx5KGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zLElOREVYPWNsYXNlc19HQl90ZXJjLEZVTj1zdW0pCnN1bWFZcG9yQ2xhc2VzX0dCX3RlcmMKCnBFc3RpbWFkb19HQl90ZXJjPC1hcy52ZWN0b3Ioc3VtYVlwb3JDbGFzZXNfR0JfdGVyYy90YWJsZShjbGFzZXNfR0JfdGVyYykpCnBFc3RpbWFkb19HQl90ZXJjIDwtIHBFc3RpbWFkb19HQl90ZXJjIC0xCgpsb2dpdF9HQl90ZXJjPC1sb2cocEVzdGltYWRvX0dCX3RlcmMvKDEtKHBFc3RpbWFkb19HQl90ZXJjKSkpCgpwbG90KG1lZGlhc19HQl90ZXJjLGxvZ2l0X0dCX3RlcmMseGxhYj0iTWVkaWEgZGUgR0IgcG9yIGNsYXNlIiwKICAgICB5bGFiPSJMb2dpdCBkZSBQcm9iYWJpbGlkYWQgZGUgU2FuZ3JhZG8gcG9yIGNsYXNlIiwKICAgICBtYWluPSAiUHJ1ZWJhIGRlIHJlbGFjacOzbiBsaW5lYWw6IEdCIHRlcmNpbGVzIGNvbiBMb2dpdCBkZSBwcm9iYWJpbGlkYWQgZGUKICAgICBzYW5ncmFkbyIsY29sPSJibHVlIixwY2g9MjAsIHR5cGU9Imxvd2VzcyIpCgojIFNlcGFybyBlbiBjdWFydGlsZXMgeSBoYWdvIGdyYWZpY29zIApiYXNlX3NlbnMkTG9nX0xhYl9HQl9DdWFydCA8LSBudGlsZShiYXNlX3NlbnMkTG9nX0xhYl9HQiwgNCkgCmNsYXNlc19HQl9DdWFydDwtYmFzZV9zZW5zJExvZ19MYWJfR0JfQ3VhcnQKdGFibGUoY2xhc2VzX0dCX0N1YXJ0KSAKCm1lZGlhc19HQl9DdWFydDwtdGFwcGx5KGJhc2Vfc2VucyRMb2dfTGFiX0dCLElOREVYPWNsYXNlc19HQl9DdWFydCxGVU49bWVhbikgCgpzdW1hWXBvckNsYXNlc19HQl9DdWFydDwtdGFwcGx5KGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zLElOREVYPWNsYXNlc19HQl9DdWFydCxGVU49c3VtKQpzdW1hWXBvckNsYXNlc19HQl9DdWFydAoKcEVzdGltYWRvX0dCX0N1YXJ0PC1hcy52ZWN0b3Ioc3VtYVlwb3JDbGFzZXNfR0JfQ3VhcnQvdGFibGUoY2xhc2VzX0dCX0N1YXJ0KSkKcEVzdGltYWRvX0dCX0N1YXJ0IDwtIHBFc3RpbWFkb19HQl9DdWFydCAtMQoKbG9naXRfR0JfQ3VhcnQ8LWxvZyhwRXN0aW1hZG9fR0JfQ3VhcnQvKDEtKHBFc3RpbWFkb19HQl9DdWFydCkpKQoKcGxvdChtZWRpYXNfR0JfQ3VhcnQsbG9naXRfR0JfQ3VhcnQseGxhYj0iTWVkaWEgZGUgR0IgcG9yIGNsYXNlIiwKICAgICB5bGFiPSJMb2dpdCBkZSBQcm9iYWJpbGlkYWQgZGUgU2FuZ3JhZG8gcG9yIGNsYXNlIiwKICAgICBtYWluPSAiUHJ1ZWJhIGRlIHJlbGFjacOzbiBsaW5lYWw6IEdCIGN1YXJ0aWxlcyBjb24gTG9naXQgZGUgcHJvYmFiaWxpZGFkIGRlCiAgICAgc2FuZ3JhZG8iLGNvbD0iYmx1ZSIscGNoPTIwLCB0eXBlPSJsb3dlc3MiKQoKIyBTZXBhcm8gZW4gcXVpbnRpbGVzIHkgaGFnbyBncmFmaWNvcyAKYmFzZV9zZW5zJExvZ19MYWJfR0JfUXVpbnQgPC0gbnRpbGUoYmFzZV9zZW5zJExvZ19MYWJfR0IsIDUpIApjbGFzZXNfR0JfUXVpbnQ8LWJhc2Vfc2VucyRMb2dfTGFiX0dCX1F1aW50CnRhYmxlKGNsYXNlc19HQl9RdWludCkgCgptZWRpYXNfR0JfUXVpbnQ8LXRhcHBseShiYXNlX3NlbnMkTG9nX0xhYl9HQixJTkRFWD1jbGFzZXNfR0JfUXVpbnQsRlVOPW1lYW4pIAoKc3VtYVlwb3JDbGFzZXNfR0JfUXVpbnQ8LXRhcHBseShiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcyxJTkRFWD1jbGFzZXNfR0JfUXVpbnQsRlVOPXN1bSkKc3VtYVlwb3JDbGFzZXNfR0JfUXVpbnQKCnBFc3RpbWFkb19HQl9RdWludDwtYXMudmVjdG9yKHN1bWFZcG9yQ2xhc2VzX0dCX1F1aW50L3RhYmxlKGNsYXNlc19HQl9RdWludCkpCnBFc3RpbWFkb19HQl9RdWludCA8LSBwRXN0aW1hZG9fR0JfUXVpbnQgLTEKCmxvZ2l0X0dCX1F1aW50PC1sb2cocEVzdGltYWRvX0dCX1F1aW50LygxLShwRXN0aW1hZG9fR0JfUXVpbnQpKSkKCnBsb3QobWVkaWFzX0dCX1F1aW50LGxvZ2l0X0dCX1F1aW50LHhsYWI9Ik1lZGlhIGRlIEdCIHBvciBjbGFzZSIsCiAgICAgeWxhYj0iTG9naXQgZGUgUHJvYmFiaWxpZGFkIGRlIFNhbmdyYWRvIHBvciBjbGFzZSIsCiAgICAgbWFpbj0gIlBydWViYSBkZSByZWxhY2nDs24gbGluZWFsOiBHQiBxdWludGlsZXMgY29uIExvZ2l0IGRlIHByb2JhYmlsaWRhZCBkZQogICAgIHNhbmdyYWRvIixjb2w9ImJsdWUiLHBjaD0yMCwgdHlwZT0ibG93ZXNzIikKCiMgU2VwYXJvIGVuIGRvcyB5IGhhZ28gZ3JhZmljb3MgCmJhc2Vfc2VucyRMb2dfTGFiX0dCX0Jpbm9tIDwtIG50aWxlKGJhc2Vfc2VucyRMb2dfTGFiX0dCLCAyKSAKY2xhc2VzX0dCX0Jpbm9tPC1iYXNlX3NlbnMkTG9nX0xhYl9HQl9CaW5vbQp0YWJsZShjbGFzZXNfR0JfQmlub20pIAoKbWVkaWFzX0dCX0Jpbm9tPC10YXBwbHkoYmFzZV9zZW5zJExvZ19MYWJfR0IsSU5ERVg9Y2xhc2VzX0dCX0Jpbm9tLEZVTj1tZWFuKSAKCnN1bWFZcG9yQ2xhc2VzX0dCX0Jpbm9tPC10YXBwbHkoYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MsSU5ERVg9Y2xhc2VzX0dCX0Jpbm9tLEZVTj1zdW0pCnN1bWFZcG9yQ2xhc2VzX0dCX0Jpbm9tCgpwRXN0aW1hZG9fR0JfQmlub208LWFzLnZlY3RvcihzdW1hWXBvckNsYXNlc19HQl9CaW5vbS90YWJsZShjbGFzZXNfR0JfQmlub20pKQpwRXN0aW1hZG9fR0JfQmlub20gPC0gcEVzdGltYWRvX0dCX0Jpbm9tIC0xCgpsb2dpdF9HQl9CaW5vbTwtbG9nKHBFc3RpbWFkb19HQl9CaW5vbS8oMS0ocEVzdGltYWRvX0dCX0Jpbm9tKSkpCgpwbG90KG1lZGlhc19HQl9CaW5vbSxsb2dpdF9HQl9CaW5vbSx4bGFiPSJNZWRpYSBkZSBHQiBwb3IgY2xhc2UiLAogICAgIHlsYWI9IkxvZ2l0IGRlIFByb2JhYmlsaWRhZCBkZSBTYW5ncmFkbyBwb3IgY2xhc2UiLAogICAgIG1haW49ICJQcnVlYmEgZGUgcmVsYWNpw7NuIGxpbmVhbDogR0IgZG9zIGdydXBvcyBjb24gTG9naXQgZGUgcHJvYmFiaWxpZGFkIGRlCiAgICAgc2FuZ3JhZG8iLGNvbD0iYmx1ZSIscGNoPTIwLCB0eXBlPSJsb3dlc3MiKQpgYGAKCiMjIyMgZykgQ2xlYXJlbmNlIGRlIGNyZWF0aW5pbmEKCmBgYHtyfQpiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcyA8LSBhcy5mYWN0b3IoYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MpCnN1bW1hcnkoYmFzZV9zZW5zJExvZ19DbENyKQpiYXNlX3NlbnMkTG9nX0NsQ3JfQ29ydGU8LWN1dChiYXNlX3NlbnMkTG9nX0NsQ3IsYnJlYWtzPXNlcSg3LjAzLDExLjU5LGxlbmd0aC5vdXQ9NSkpCnRhYmxlKGJhc2Vfc2VucyRMb2dfQ2xDcl9Db3J0ZSkKCmNsYXNlc19Mb2dfQ2xDciA8LSBjdXQoYmFzZV9zZW5zJExvZ19DbENyLGJyZWFrcz1zZXEoNy4wMywxMS41OSxsZW5ndGgub3V0PTEwKSkKdGFibGUoY2xhc2VzX0xvZ19DbENyKQoKbWVkaWFzX0xvZ19DbENyPC10YXBwbHkoYmFzZV9zZW5zJExvZ19DbENyLElOREVYPWNsYXNlc19Mb2dfQ2xDcixGVU49bWVhbikgCgpiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcyA8LSBhcy5pbnRlZ2VyKGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zKQpzdW1hWXBvckNsYXNlc19Mb2dfQ2xDcjwtdGFwcGx5KGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zLElOREVYPWNsYXNlc19Mb2dfQ2xDcixGVU49c3VtKQpzdW1hWXBvckNsYXNlc19Mb2dfQ2xDcgoKcEVzdGltYWRvX0xvZ19DbENyPC1hcy52ZWN0b3Ioc3VtYVlwb3JDbGFzZXNfTG9nX0NsQ3IvdGFibGUoY2xhc2VzX0xvZ19DbENyKSkKcEVzdGltYWRvX0xvZ19DbENyIDwtIHBFc3RpbWFkb19Mb2dfQ2xDciAtMQoKbG9naXRfTG9nX0NsQ3I8LWxvZyhwRXN0aW1hZG9fTG9nX0NsQ3IvKDEtKHBFc3RpbWFkb19Mb2dfQ2xDcikpKQoKIyBTZXBhcm8gZW4gdGVyY2lsZXMgeSBoYWdvIGdyYWZpY29zCgpiYXNlX3NlbnMkTG9nX0NsQ3JfVGVyYyA8LSBudGlsZShiYXNlX3NlbnMkTG9nX0NsQ3IsIDMpIApjbGFzZXNfTG9nX0NsQ3JfdGVyYzwtYmFzZV9zZW5zJExvZ19DbENyX1RlcmMKdGFibGUoY2xhc2VzX0xvZ19DbENyX3RlcmMpIAoKbWVkaWFzX0xvZ19DbENyX3RlcmM8LXRhcHBseShiYXNlX3NlbnMkTG9nX0NsQ3IsSU5ERVg9Y2xhc2VzX0xvZ19DbENyX3RlcmMsRlVOPW1lYW4pIAoKc3VtYVlwb3JDbGFzZXNfTG9nX0NsQ3JfdGVyYzwtdGFwcGx5KGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zLElOREVYPWNsYXNlc19Mb2dfQ2xDcl90ZXJjLEZVTj1zdW0pCnN1bWFZcG9yQ2xhc2VzX0xvZ19DbENyX3RlcmMKCnBFc3RpbWFkb19Mb2dfQ2xDcl90ZXJjPC1hcy52ZWN0b3Ioc3VtYVlwb3JDbGFzZXNfTG9nX0NsQ3JfdGVyYy90YWJsZShjbGFzZXNfTG9nX0NsQ3JfdGVyYykpCnBFc3RpbWFkb19Mb2dfQ2xDcl90ZXJjIDwtIHBFc3RpbWFkb19Mb2dfQ2xDcl90ZXJjIC0xCgpsb2dpdF9Mb2dfQ2xDcl90ZXJjPC1sb2cocEVzdGltYWRvX0xvZ19DbENyX3RlcmMvKDEtKHBFc3RpbWFkb19Mb2dfQ2xDcl90ZXJjKSkpCgpwbG90KG1lZGlhc19Mb2dfQ2xDcl90ZXJjLGxvZ2l0X0xvZ19DbENyX3RlcmMseGxhYj0iTWVkaWEgZGUgTG9nX0NsQ3IgcG9yIGNsYXNlIiwKICAgICB5bGFiPSJMb2dpdCBkZSBQcm9iYWJpbGlkYWQgZGUgU2FuZ3JhZG8gcG9yIGNsYXNlIiwKICAgICBtYWluPSAiUHJ1ZWJhIGRlIHJlbGFjacOzbiBsaW5lYWw6IExvZ19DbENyIHRlcmNpbGVzIGNvbiBMb2dpdCBkZSBwcm9iYWJpbGlkYWQgZGUKICAgICBzYW5ncmFkbyIsY29sPSJibHVlIixwY2g9MjAsIHR5cGU9Imxvd2VzcyIpCgojIFNlcGFybyBlbiBjdWFydGlsZXMgeSBoYWdvIGdyYWZpY29zIApiYXNlX3NlbnMkTG9nX0NsQ3JfQ3VhcnQgPC0gbnRpbGUoYmFzZV9zZW5zJExvZ19DbENyLCA0KSAKY2xhc2VzX0xvZ19DbENyX0N1YXJ0PC1iYXNlX3NlbnMkTG9nX0NsQ3JfQ3VhcnQKdGFibGUoY2xhc2VzX0xvZ19DbENyX0N1YXJ0KSAKCm1lZGlhc19Mb2dfQ2xDcl9DdWFydDwtdGFwcGx5KGJhc2Vfc2VucyRMb2dfQ2xDcixJTkRFWD1jbGFzZXNfTG9nX0NsQ3JfQ3VhcnQsRlVOPW1lYW4pIAoKc3VtYVlwb3JDbGFzZXNfTG9nX0NsQ3JfQ3VhcnQ8LXRhcHBseShiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcyxJTkRFWD1jbGFzZXNfTG9nX0NsQ3JfQ3VhcnQsRlVOPXN1bSkKc3VtYVlwb3JDbGFzZXNfTG9nX0NsQ3JfQ3VhcnQKCnBFc3RpbWFkb19Mb2dfQ2xDcl9DdWFydDwtYXMudmVjdG9yKHN1bWFZcG9yQ2xhc2VzX0xvZ19DbENyX0N1YXJ0L3RhYmxlKGNsYXNlc19Mb2dfQ2xDcl9DdWFydCkpCnBFc3RpbWFkb19Mb2dfQ2xDcl9DdWFydCA8LSBwRXN0aW1hZG9fTG9nX0NsQ3JfQ3VhcnQgLTEKCmxvZ2l0X0xvZ19DbENyX0N1YXJ0PC1sb2cocEVzdGltYWRvX0xvZ19DbENyX0N1YXJ0LygxLShwRXN0aW1hZG9fTG9nX0NsQ3JfQ3VhcnQpKSkKCnBsb3QobWVkaWFzX0xvZ19DbENyX0N1YXJ0LGxvZ2l0X0xvZ19DbENyX0N1YXJ0LHhsYWI9Ik1lZGlhIGRlIExvZ19DbENyIHBvciBjbGFzZSIsCiAgICAgeWxhYj0iTG9naXQgZGUgUHJvYmFiaWxpZGFkIGRlIFNhbmdyYWRvIHBvciBjbGFzZSIsCiAgICAgbWFpbj0gIlBydWViYSBkZSByZWxhY2nDs24gbGluZWFsOiBMb2dfQ2xDciBjdWFydGlsZXMgY29uIExvZ2l0IGRlIHByb2JhYmlsaWRhZCBkZQogICAgIHNhbmdyYWRvIixjb2w9ImJsdWUiLHBjaD0yMCwgdHlwZT0ibG93ZXNzIikKCiMgU2VwYXJvIGVuIHF1aW50aWxlcyB5IGhhZ28gZ3JhZmljb3MgCmJhc2Vfc2VucyRMb2dfQ2xDcl9RdWludCA8LSBudGlsZShiYXNlX3NlbnMkTG9nX0NsQ3IsIDUpIApjbGFzZXNfTG9nX0NsQ3JfUXVpbnQ8LWJhc2Vfc2VucyRMb2dfQ2xDcl9RdWludAp0YWJsZShjbGFzZXNfTG9nX0NsQ3JfUXVpbnQpIAoKbWVkaWFzX0xvZ19DbENyX1F1aW50PC10YXBwbHkoYmFzZV9zZW5zJExvZ19DbENyLElOREVYPWNsYXNlc19Mb2dfQ2xDcl9RdWludCxGVU49bWVhbikgCgpzdW1hWXBvckNsYXNlc19Mb2dfQ2xDcl9RdWludDwtdGFwcGx5KGJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zLElOREVYPWNsYXNlc19Mb2dfQ2xDcl9RdWludCxGVU49c3VtKQpzdW1hWXBvckNsYXNlc19Mb2dfQ2xDcl9RdWludAoKcEVzdGltYWRvX0xvZ19DbENyX1F1aW50PC1hcy52ZWN0b3Ioc3VtYVlwb3JDbGFzZXNfTG9nX0NsQ3JfUXVpbnQvdGFibGUoY2xhc2VzX0xvZ19DbENyX1F1aW50KSkKcEVzdGltYWRvX0xvZ19DbENyX1F1aW50IDwtIHBFc3RpbWFkb19Mb2dfQ2xDcl9RdWludCAtMQoKbG9naXRfTG9nX0NsQ3JfUXVpbnQ8LWxvZyhwRXN0aW1hZG9fTG9nX0NsQ3JfUXVpbnQvKDEtKHBFc3RpbWFkb19Mb2dfQ2xDcl9RdWludCkpKQoKcGxvdChtZWRpYXNfTG9nX0NsQ3JfUXVpbnQsbG9naXRfTG9nX0NsQ3JfUXVpbnQseGxhYj0iTWVkaWEgZGUgTG9nX0NsQ3IgcG9yIGNsYXNlIiwKICAgICB5bGFiPSJMb2dpdCBkZSBQcm9iYWJpbGlkYWQgZGUgU2FuZ3JhZG8gcG9yIGNsYXNlIiwKICAgICBtYWluPSAiUHJ1ZWJhIGRlIHJlbGFjacOzbiBsaW5lYWw6IExvZ19DbENyIHF1aW50aWxlcyBjb24gTG9naXQgZGUgcHJvYmFiaWxpZGFkIGRlCiAgICAgc2FuZ3JhZG8iLGNvbD0iYmx1ZSIscGNoPTIwLCB0eXBlPSJsb3dlc3MiKQoKIyBTZXBhcm8gZW4gZG9zIHkgaGFnbyBncmFmaWNvcyAKYmFzZV9zZW5zJExvZ19DbENyX0Jpbm9tIDwtIG50aWxlKGJhc2Vfc2VucyRMb2dfQ2xDciwgMikgCmNsYXNlc19Mb2dfQ2xDcl9CaW5vbTwtYmFzZV9zZW5zJExvZ19DbENyX0Jpbm9tCnRhYmxlKGNsYXNlc19Mb2dfQ2xDcl9CaW5vbSkgCgptZWRpYXNfTG9nX0NsQ3JfQmlub208LXRhcHBseShiYXNlX3NlbnMkTG9nX0NsQ3IsSU5ERVg9Y2xhc2VzX0xvZ19DbENyX0Jpbm9tLEZVTj1tZWFuKSAKCnN1bWFZcG9yQ2xhc2VzX0xvZ19DbENyX0Jpbm9tPC10YXBwbHkoYmFzZV9zZW5zJENvbXBsX1NhbmdfVG9kb3MsSU5ERVg9Y2xhc2VzX0xvZ19DbENyX0Jpbm9tLEZVTj1zdW0pCnN1bWFZcG9yQ2xhc2VzX0xvZ19DbENyX0Jpbm9tCgpwRXN0aW1hZG9fTG9nX0NsQ3JfQmlub208LWFzLnZlY3RvcihzdW1hWXBvckNsYXNlc19Mb2dfQ2xDcl9CaW5vbS90YWJsZShjbGFzZXNfTG9nX0NsQ3JfQmlub20pKQpwRXN0aW1hZG9fTG9nX0NsQ3JfQmlub20gPC0gcEVzdGltYWRvX0xvZ19DbENyX0Jpbm9tIC0xCgpsb2dpdF9Mb2dfQ2xDcl9CaW5vbTwtbG9nKHBFc3RpbWFkb19Mb2dfQ2xDcl9CaW5vbS8oMS0ocEVzdGltYWRvX0xvZ19DbENyX0Jpbm9tKSkpCgpwbG90KG1lZGlhc19Mb2dfQ2xDcl9CaW5vbSxsb2dpdF9Mb2dfQ2xDcl9CaW5vbSx4bGFiPSJNZWRpYSBkZSBMb2dfQ2xDciBwb3IgY2xhc2UiLAogICAgIHlsYWI9IkxvZ2l0IGRlIFByb2JhYmlsaWRhZCBkZSBTYW5ncmFkbyBwb3IgY2xhc2UiLAogICAgIG1haW49ICJQcnVlYmEgZGUgcmVsYWNpw7NuIGxpbmVhbDogTG9nX0NsQ3IgZG9zIGdydXBvcyBjb24gTG9naXQgZGUgcHJvYmFiaWxpZGFkIGRlCiAgICAgc2FuZ3JhZG8iLGNvbD0iYmx1ZSIscGNoPTIwLCB0eXBlPSJsb3dlc3MiKQpgYGAKCiMjIyBjKSBBbmFsaXNpcyB1bml2YXJpYWRvIGx1ZWdvIGRlIGFuYWxpc2lzIGRlIHNlbnNpYmlsaWRhZAoKYGBge3J9CmJhc2Vfc2VucyRDb21wbF9TYW5nX1RvZG9zIDwtIGFzLmZhY3RvcihiYXNlX3NlbnMkQ29tcGxfU2FuZ19Ub2RvcykKI2VkYWQgbmluZ3VubyBlcyBzaWduaWZpY2F0aXZvCnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBQYWNfRWRhZF9CaW5vbSwgZGF0YSA9IGJhc2Vfc2VucywgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKQpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gUGFjX0VkYWRfVGVyYywgZGF0YSA9IGJhc2Vfc2VucywgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKQpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gUGFjX0VkYWRfQ3VhcnQsIGRhdGEgPSBiYXNlX3NlbnMsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IFBhY19FZGFkX1F1aW50LCBkYXRhID0gYmFzZV9zZW5zLCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpCgojRlIgdGVyY2lsZXMgZXMgc2lnbmlmaWNhdGl2bwpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gQ0NfRlJfSW5ncmVzb19CaW5vbSwgZGF0YSA9IGJhc2Vfc2VucywgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKQpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gQ0NfRlJfSW5ncmVzb19UZXJjLCBkYXRhID0gYmFzZV9zZW5zLCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpICMwLjA2CnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBDQ19GUl9JbmdyZXNvX0N1YXJ0LCBkYXRhID0gYmFzZV9zZW5zLCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpCnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBDQ19GUl9JbmdyZXNvX1F1aW50LCBkYXRhID0gYmFzZV9zZW5zLCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpCgojRkMgdG9kb3Mgc2lnbmlmaWNhdGl2b3MgcGVybyB0ZXJjaWxlcyBsaW5lYWwKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IExvZ19GQ19CaW5vbSwgZGF0YSA9IGJhc2Vfc2VucywgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKQpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gTG9nX0ZDX1RlcmMsIGRhdGEgPSBiYXNlX3NlbnMsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkgIzAuMDA3CnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBMb2dfRkNfQ3VhcnQsIGRhdGEgPSBiYXNlX3NlbnMsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IExvZ19GQ19RdWludCwgZGF0YSA9IGJhc2Vfc2VucywgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKQoKI1RBUyB0ZXJjaWxlcyBib3JkZXJsaW5lIHkgbGluZWFsCnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBMb2dfVEFTX0Jpbm9tLCBkYXRhID0gYmFzZV9zZW5zLCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpCnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBMb2dfVEFTX1RlcmMsIGRhdGEgPSBiYXNlX3NlbnMsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IExvZ19UQVNfQ3VhcnQsIGRhdGEgPSBiYXNlX3NlbnMsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkgIzEzCnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBMb2dfVEFTX1F1aW50LCBkYXRhID0gYmFzZV9zZW5zLCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpCgojUGxhcSBuYWRhIGVzIGxpbmVhbCBuaSBzaWduaWZpY2F0aXZvCnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBMb2dfTGFiX1BsYXFfQmlub20sIGRhdGEgPSBiYXNlX3NlbnMsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IExvZ19MYWJfUGxhcV9UZXJjLCBkYXRhID0gYmFzZV9zZW5zLCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpCnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBMb2dfTGFiX1BsYXFfQ3VhcnQsIGRhdGEgPSBiYXNlX3NlbnMsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IExvZ19MYWJfUGxhcV9RdWludCwgZGF0YSA9IGJhc2Vfc2VucywgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKQoKI0dCIHRlcmNpbGVzIHNpZ25pZmljYXRpdm8geSBsaW5lYWwKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IExvZ19MYWJfR0JfQmlub20sIGRhdGEgPSBiYXNlX3NlbnMsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IExvZ19MYWJfR0JfVGVyYywgZGF0YSA9IGJhc2Vfc2VucywgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKQpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gTG9nX0xhYl9HQl9DdWFydCwgZGF0YSA9IGJhc2Vfc2VucywgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKQpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gTG9nX0xhYl9HQl9RdWludCwgZGF0YSA9IGJhc2Vfc2VucywgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKQoKI0NsQ3Igbm8gZXMgc2lnbmlmaWNhdGl2byBuaSBsaW5lYWwKc3VtbWFyeShnbG0oQ29tcGxfU2FuZ19Ub2RvcyB+IExvZ19DbENyX0Jpbm9tLCBkYXRhID0gYmFzZV9zZW5zLCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpCnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBMb2dfQ2xDcl9UZXJjLCBkYXRhID0gYmFzZV9zZW5zLCBmYW1pbHkgPSBiaW5vbWlhbCAobGluayA9IGxvZ2l0KSkpCnN1bW1hcnkoZ2xtKENvbXBsX1NhbmdfVG9kb3MgfiBMb2dfQ2xDcl9DdWFydCwgZGF0YSA9IGJhc2Vfc2VucywgZmFtaWx5ID0gYmlub21pYWwgKGxpbmsgPSBsb2dpdCkpKQpzdW1tYXJ5KGdsbShDb21wbF9TYW5nX1RvZG9zIH4gTG9nX0NsQ3JfUXVpbnQsIGRhdGEgPSBiYXNlX3NlbnMsIGZhbWlseSA9IGJpbm9taWFsIChsaW5rID0gbG9naXQpKSkKCmBgYAoKPiogTGEgdHJhbnNmb3JtYWNpw7NuIGRlIHZhcmlhYmxlcyBvIHNlcGFyYWNpw7NuIGVuIHRlcmNpbGVzLWN1YXJ0aWxlcyBubyBhcG9ydGEgaW5mb3JtYWNpw7NuIHV0aWwgcGFyYSBFREFELCBQTEFRVUVUQVMgbmkgQ2xDci4gUG9yIGVuZGUgZXN0YXMgdmFyaWFibGVzIG5vIHBvZHLDrWFuIHNlciBjb25zaWRlcmFkYXMgZW4gdW4gYW7DoWxpc2lzIGRlIHJlZ3Jlc2nDs24gbG9nw61zdGljYS4KUGFyYSBsYSB0cmFuc2Zvcm1hY2nDs24gZGUgR0IsIFRBUywgRkMgeSBGUiBoYXkgc2lnbmlmaWNhY2nDs24gZXN0YWTDrXN0aWNhIGVuIG1vZGVsbyB1bml2YXJpYWRvIHNpIHNlIGxvcyBkaXZpZGUgZW4gdGVyY2lsZXMuCgoKIyMgNykgKipNw6l0b2RvcyBkZSBzZWxlY2Npw7NuIGRlIHZhcmlhYmxlcyBubyBjb252ZW5jaW9uYWxlcyoqCgo+IC0gIFBhcmEgZXN0b3MgbcOpdG9kb3MgZGUgc2VsZWNjacOzbiBhdXRvbcOhdGljb3MgZGVjaWRpbW9zIGVsaW1pbmFyIGxhcyB2YXJpYWJsZXMgcXVlIG5vIHNvbiBkZSBpbnRlcsOpcyBwYXJhIGVsIHByb3DDs3NpdG8gZGUgZXN0ZSB0cmFiYWpvLiAKClBvciB1biBsYWRvIHNlIGRlY2lkZSBubyBhbmFsaXphciBzY29yZXMgcG9yIGxvcyBzaWd1aWVudGVzIG1vdGl2b3M6Ci0gU2NvcmUgZGUgUklFVEU6IGZ1ZSBkaXNlw7FhZG8gcGFyYSB0cm9tYm9zaXMgdmVub3NhIHByb2Z1bmRhIHkgdHJvbWJvZW1ib2xpc21vIGRlIHB1bG1vbi4gRXN0YSBwb2JsYWNpw7NuIHNvbG8gaW5jbHV5ZSBwYWNpZW50ZXMgY29uIHRyb21ib2VtYm9saXNtbyBwdWxtb25hciwgcG9yIGxvIGN1w6FsIGVsIHNjb3JlIHNpZW1wcmUgcHVudHVhIDEgbyBtw6FzLgotIFNjb3JlIGRlIFBFU0kgZnVlIGlkZWFkbyBwYXJhIGV2YWx1YXIgbW9ydGFsaWRhZC4gCi0gU2NvcmUgZGUgV2VsbHMgZnVlIGlkZWFkbyBwYXJhIGV2YWx1YXIgbGEgcHJvYmFiaWxpZGFkIHByZS10ZXN0IGRlIFRFUC4KClNlIGRlamEgc29sYW1lbnRlIGVsIHNjb3JlIGRlIEhBU0JMRUQsIGNvbiBsYSBzYWx2ZWRhZCBkZSBxdWUgZXN0ZSBzY29yZSBmdWUgY2FyZ2FkbyBwb3IgZWwgcGVyc29uYWwgcXVlIGxsZW5hYmEgbGEgYmFzZSB5IG5vIHNlIGNvbnN0YXRhcm9uIHRvZGFzIGxhcyB2YXJpYWJsZXMgZGUgZm9ybWEgc2VwYXJhZGEgKHVzbyBkZSBhbnRpYWdyZWdhbnRlcywgaGlwZXJ0ZW5zacOzbiBkZXNjb250cm9sYWRhKS4KClBvciBvdHJvIGxhZG8gc2UgZWxpbWluYW4gbGFzIHZhcmlhYmxlcyBxdWUgbm8gaW5mbHV5ZW4gZW4gZWwgc2FuZ3JhZG8gc2lubyBxdWUgc29uIGNvbnNlY3VlbmNpYSB0ZW1wb3JhbCBwb3N0ZXJpb3IgYWwgbWlzbW86IHVzbyBkZSBmaWx0cm8gZGUgVkNJIChGVkNJKS4KCkRlY2lkaW1vcyBlbGltaW5hciBsYXMgc2lndWllbnRlcyB2YXJpYWJsZXMgUEVTSV9UYXF1aWNhcmRpYSwgUEVTSV9IaXBvdGVuc2nDs24sIFBFU0lfVGFxdWlwbmVhLCBQRVNJX0hpcG90ZXJtaWEgeSBDQ19TYU85MCAoc2F0dXJhY8Otb24gbWVub3IgYSA5MCUpIHlhIHF1ZSBpbmNsdWlyZW1vcyBsYXMgdmFyaWFibGVzIGNvbnRpbnVhcyBlbiBlbCBhbsOhbGlzaXM6IEZSLCBGQywgVEFTIHkgc2F0dXJhY2nDs24gZGUgb3jDrWdlbm8gYWlyZSBhbWJpZW50ZSBhbCBpbmdyZXNvLiAKClNlIGVsaW1pbmFuIG90cmFzIHZhcmlhYmxlcyBxdWUgdGFtcG9jbyBzb24gZGUgaW50ZXJlcyBwYXJhIGVsIGFuYWxpc2lzOiBTZXJ2aWNpbyBhIENhcmdvLCBNb3Rpdm8gZGUgSW50ZXJuYWNpw7NuLCBVc28gZGUgRE9BQ3MgYWwgYWx0YSwgVGlwbyBkZSBBQ08gYWwgYWx0YSAobGEgbWF5b3JpYSBkZSBsb3MgcGFjaWVudGVzIHNhbmdyYXJvbiBlbiBsYSBpbnRlcm5hY2lvbiB5IG5vIGVuIGVsIHNlZ3VpbWllbm90byBhIDMwIGTDrWFzKSwgdXNvIGRlIEFDTyBlbiBsYSBpbnRlcm5hY2nDs24gKHNvbGFtZW50ZSAzIGRlIDIzIHBhY2llbnRlcyBubyByZWNpYmllcm9uIGFudGljb2FndWxhY2lvbiBwb3Igc2FuZ3JhZG8pLCBBbHRhIGNhcmdhIHRyb21iw7N0aWNhIHBvciBUQUMsIENvbXBsaWNhY2lvbmVzIGhlbW9kaW7DoW1pY2FzIGVuIGxhIGludGVybmFjacOzbi4KClNlIGRlY2lkacOzIGluY2x1aXIgbGFzIHZhcmlhYmxlcyBURVAvVFZQIHByZXZpbyBnbG9iYWwgeSBIZW1vcnJhZ2lhIE1heW9yIGdsb2JhbCBlbiB2ZXogZGUgbGFzIHZhcmlhYmxlcyBURVAgcHJldmlvIG1lbm9yIGEgMyBtZXNlcyB5IEhlbW9ycmFnaWEgbWF5b3IgcmVjaWVudGUuIAoKRGVqYW1vcyBzb2xhbWVudGUgbGEgdmFyaWFibGUgQ2xlYXJlbmNlIGRlIGNyZWF0aW5pbmEgeWEgcXVlIGVzIGxhIHF1ZSBtZWpvciBjb3JyZWxhY2lvbmEsIGVsaW1pbmFtb3MgcGFyYSBlc3RvcyBtw6l0b2RvcyBkZSBzZWxlY2Npw7NuIFBhY19JUkNfR2xvYmFsLCBMYWJfQ3IuIAoKUG9yIG90cm8gbGFkbywgc2UgdG9tbyBsYSBkZWNpc2nDs24gZGUgZGljdG9taXphciBsYSB2YXJpYWJsZSBNb3Rpdm8gZGUgaW50ZXJuYWNpw7NuIGVuIDI6IHBvciBURVAgbyBubyBwb3IgVEVQLCBkZWJpZG8gYSBsYSBwb2NhIGNhbnRpZGFkIGRlIGNhc29zIHBvciBvdHJvcyBtb3Rpdm9zIG5vIHNlIHB1ZG8gcmVhbGl6YXIgdW4gYW7DoWxpc2lzIGNvbiBtw6FzIGNhdGVnb3LDrWFzLiBUYW1iacOpbiBzZSBkaWNvdG9taXrDsyBsYSB2YXJpYWJsZSBFZGFkIGVuIG1heW9yZXMgbyBtZW5vcmVzIGRlIDc1IGHDsW9zLCB5YSBxdWUgbGEgdmFyaWFibGUgY3VhbnRpdGF0aXZhIG5vIGN1bXBsZSBjb24gZWwgc3VwdWVzdG8gZGUgbGluZWFsaWRhZCB5IGVzIGRlIG51ZXN0cm8gaW50ZXLDqXMgcXVlIHNlYSBhZ3JlZ2FkYS4gTGEgZGljb3RvbWl6YWNpw7NuIGVuIDc1IHNlIHJlYWxpesOzIHBvciBiaWJsaW9ncmFmw61hLCB5YSBxdWUgc2NvcmVzIGNvbW8gZWwgZGUgUklFVEUgdXRpbGl6YW4gZXN0YSBlZGFkIHBhcmEgZXZhbHVhciBlbCByaWVzZ28gZGUgc2FuZ3JhZG8uCgphKSAjIyMgU2VsZWNjacOzbiBkZSB2YXJpYWJsZXMKYGBge3J9CgpiYXNlX2ltcCA8LSBiYXNlX2JhY2t1cApiYXNlX2ltcCA8LSBiYXNlX2ltcFssIW5hbWVzKGJhc2VfaW1wKSAlaW4lIGMoIlBhY19JUkNnbG9iYWwiLCJMYWJfQ3IiLCAiRUNPVFRfRGlzZlZEIiwgIkRPQUNfc2lfdnNfbm8iLCJBbHRhX1R0b19UaXBvc0FDTyIsICJGVkNJIiwgIlRpZW1wb0ludCIsICJSSUVURV9HcnVwbyIsICJBQ09pbnQiLCAiUGFjX1JlcG9zbyIsICJQRVNJX0hpcG90ZXJtaWEiLCAiRUNPVFRfRlNWSSIsICJJbnRfT19BbHRvX1JpZXNnb19DYWxjIiwgIlBFU0lfVGFxdWljYXJkaWEiLCAiUEVTSV9UYXF1aXBuZWEiLCAiU2VydmljaW9DYXJnbyIsICJUTF9jdWFsIiwgIlBFU0lfRGV0X1NlbnMiLCAiUEVTSV9IaXBvdGVuc2lvbiIsICJDQ19TYU85MCIsICJQYWNfVEVQX3ByZXZpb19tZW5vcl8zX21lc2VzIiwgIlBFU0lFQ0hPIiwgIlBFU0ljYWxjIiwgIldlbGxzIiwgIkhBU0JMRUQiLCAiUklFVEVfQ2FsYyIsICJNb3RJbnQiLCAiVHJhdW1hIiwgIlR0b19SZXBlcmYiLCAiQ29tcGxfU29wb3J0ZUhEX05PIiwgIkxhYl9IYl9Db3J0ZSIsICJMYWJfUGxhcV9Db3J0ZSIsICJFc3RSaWVzZ28iLCAiTGFiX0h0byIsICJQRVNJX0NhbGMiLCAiUEVTSXNDYWxjIiwgIlBFU0lfY2xhc2lmIiwgIlBhY19Db2JlcnR1cmEiLCAiUGFjX0VkYWRfQ29ydGUiLCAiQWx0YV9DYXJnYV9Ucm9tYm9fVEFDIiwgIm1pc3MudW5pdiIsICJQYWNfSGVtb3JyYWdpYV9QcmV2aWFfTWF5b3JfUmVjaWVudGUiLCAiUEVTSXNfQ2xhc2lmIiwgIklNQyIpXQpgYGAKCiMjIyBhKSBSYW5kb20gRm9yZXN0Cgo+KiBFbCBzZWd1bmRvIG3DqXRvZG8gZGUgYW7DoWxpc2lzIHBhcmEgbGEgc2VsZWNjacOzbiBkZSB2YXJpYWJsZXMgZXMgUmFuZG9tIEZvcmVzdC4gRW4gZXN0ZSBtw6l0b2RvIG5vIGluY2x1aW1vcyBsYXMgdmFyaWFibGVzIHRyYW5zZm9ybWFkYXMuIAoKYGBge3J9CmJhc2VfaW1wIDwtIG1hcF9pZigueCA9IGJhc2VfaW1wLCAucCA9IGlzLmNoYXJhY3RlciwgLmYgPSBhcy5mYWN0b3IpICU+JQogIGFzLmRhdGEuZnJhbWUoKQoKbW9kZWxvX3JhbmRmb3Jlc3QyIDwtIHJhbmRvbUZvcmVzdChmb3JtdWxhID0gQ29tcGxfU2FuZ19Ub2RvcyB+IC4gLCBkYXRhID0gYmFzZV9pbXAsIG10cnkgPSA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0YW5jZSA9IFRSVUUsIG50cmVlID0gMTAwMCkKCmltcG9ydGFuY2lhMiA8LSBhcy5kYXRhLmZyYW1lKG1vZGVsb19yYW5kZm9yZXN0MiRpbXBvcnRhbmNlKQppbXBvcnRhbmNpYTIgPC0gcm93bmFtZXNfdG9fY29sdW1uKGltcG9ydGFuY2lhMiwgdmFyID0gInZhcmlhYmxlIikKaW1wb3J0YW5jaWEyIDwtIHJlbmFtZS52YXJpYWJsZShpbXBvcnRhbmNpYTIsICIlSW5jTVNFIiwgIk1lYW5EZWNyZWFzZUFjY3VyYWN5IikKaW1wb3J0YW5jaWEyIDwtIHJlbmFtZS52YXJpYWJsZShpbXBvcnRhbmNpYTIsICJJbmNOb2RlUHVyaXR5IiwgIk1lYW5EZWNyZWFzZUdpbmkiKQoKCnAxXzIgPC0gZ2dwbG90IChkYXRhID0gaW1wb3J0YW5jaWEyLCBhZXMgKCB4ID0gcmVvcmRlciAodmFyaWFibGUsIE1lYW5EZWNyZWFzZUFjY3VyYWN5KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gTWVhbkRlY3JlYXNlQWNjdXJhY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gTWVhbkRlY3JlYXNlQWNjdXJhY3kpKSArIAogIGxhYnMgKHggPSAidmFyaWFibGUiLCB0aXRsZSA9ICJSZWR1Y2Npb24gZGUgQWNjdXJhY3kiKSArCiAgZ2VvbV9jb2wgKCkgKwogIGNvb3JkX2ZsaXAgKCkgKwogIHRoZW1lX2J3ICgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCgpwMV8yCgpgYGAKCj4gU2Ugb2JzZXJ2YW4gcXVlIGxhcyB2YXJpYWJsZXMgY29uIG1heW9yIGltcG9ydGFuY2lhIHNvbjogQ2xDciwgRWRhZCwgSGVtb2dsb2JpbmEsIFBlc28sIEZDLCBQU0FQLCBQbGFxdWV0YXMsIENpcnVnw61hIHByZXZpYSAoUGFjX0N4X1RvdGFsKSwgU2F0dXJhY2nDs24gTzIgeSBHQi4gCgojIyMgYikgTGFzc28gY29uIHRvZGFzIGxhcyB2YXJpYWJsZXMKCj4qIFNlIGRlY2lkZSByZWFsaXphciBMYXNzbyBjb21vIHRlcmNlcmEgeSDDumxpdG1hIGZvcm1hIGRlIHNlbGVjY2nDs24gZGUgdmFyaWFibGVzLgoKYGBge3J9CnhfMiA8LSBtb2RlbC5tYXRyaXgoQ29tcGxfU2FuZ19Ub2RvcyB+LiwgYmFzZV9pbXApCnlfMiA8LSBiYXNlX2ltcCRDb21wbF9TYW5nX1RvZG9zCgp2aXNfbWlzcyhiYXNlX2ltcCkKCmRpbSh4XzIpICNoYXkgbWFzIHZhcmlhYmxlcyBwb3JxdWUgaGFjZSBkdW1taWVzIGRlIGxhcyBjYXRlZ29yaWNhcyA7ICkKbGFzc29fbTIgPC0gZ2xtbmV0KHhfMiwgeT1hcy5mYWN0b3IoeV8yKSwgIGFscGhhPTEsIGZhbWlseT0iYmlub21pYWwiLCBsYW1iZGEgPSBOVUxMKQoKcGxvdChsYXNzb19tMix4dmFyPSJsYW1iZGEiLGxhYmVsPVRSVUUpCnBsb3QobGFzc29fbTIseHZhcj0ibm9ybSIsbGFiZWw9VFJVRSkKCnNldC5zZWVkKDEpCmxhc3NvX20yX2N2IDwtICBjdi5nbG1uZXQoeF8yLCB5PWFzLmZhY3Rvcih5XzIpLCAgYWxwaGE9MSwgZmFtaWx5PSJiaW5vbWlhbCIsIG5mb2xkcz0xMCkKCiMgZ3VhcmRhciBsb3MgbGFtYmRhcwptaW5fbGFtYmRhX2xhc3NvX20yX2N2IDwtIGxhc3NvX20yX2N2JGxhbWJkYS5taW4KYmVzdF9sYW1iZGFfbGFzc29fbTJfY3YgPC0gbGFzc29fbTJfY3YkbGFtYmRhLjFzZQoKcGxvdChsYXNzb19tMl9jdikKYWJsaW5lKHY9bG9nKG1pbl9sYW1iZGFfbGFzc29fbTJfY3YpLCBjb2w9ImJsdWUiKQphYmxpbmUodj1sb2coYmVzdF9sYW1iZGFfbGFzc29fbTJfY3YpLCBjb2w9Im9yYW5nZSIpCgojIyMjIHNlIGNhbGN1bGFuIGxvcyBjb2VmaWNpZW50ZXMgcGFyYSBlbCBsYW1iZGEgc2VsZWNjaW9uYWRvCnZhcnNfbGFtYmRhX2Jlc3QgPC0gcHJlZGljdChsYXNzb19tMl9jdiwgdHlwZT0iY29lZmZpY2llbnRzIiwgcz1iZXN0X2xhbWJkYV9sYXNzb19tMl9jdikKdmFyc19sYW1iZGFfbWluIDwtIHByZWRpY3QobGFzc29fbTJfY3YsIHR5cGU9ImNvZWZmaWNpZW50cyIsIHM9bWluX2xhbWJkYV9sYXNzb19tMl9jdikKCmxhc3NvX20zIDwtIGdsbW5ldCh4XzIsIHk9YXMuZmFjdG9yKHlfMiksICBhbHBoYT0xLCBmYW1pbHk9ImJpbm9taWFsIiwgbGFtYmRhID0gbWluX2xhbWJkYV9sYXNzb19tMl9jdikKY29lZihsYXNzb19tMykKCmBgYAoKPiBMYXMgdmFyaWFib2VzIHNpZ25pZmljYXRpdmFzIHNvbjogQUNWLCBIZW1vcnJhZ2lhIE1heW9yIFByZXZpYSwgRkMsIFRBUywgU2F0dXJhY2nDs24gTzIsIENpcnVnw61hIHByZXZpYSwgSGIsIEdCLCBCaW9tYXJjYWRvcmVzIHkgVEFQU0UuIAoKIyAqTU9ERUxPUyBERSBSRUdSRVNJw5NOKgojIyA4KSAqKkFuYWxpc2lzIG11bHRpdmFyaWFkbyBjb24gYmFzZSBpbXB1dGFkYSBjb24gQ3Jvc3MgVmFsaWRhdGlvbiBjb24gbcOpdG9kbyAiTGVhdmUgb25lIG91dCIqKgoKIyMjIGEpIE1vZGVsbyBkZSByZWdyZXNpw7NuIGxvZ8Otc3RpY2EgY29uIHZhcmlhYmxlcyBzZWxlY2Npb25hZGFzIHBvciBhbmFsaXNpcyB1bml2YXJpYWRvCgpgYGB7cn0KCmJhc2VfdmFsaWRhdGlvbiA8LSBiYXNlX2JhY2t1cApiYXNlX3ZhbGlkYXRpb24kQ0NfRlJfSW5ncmVzb19UZXJjIDwtIGJhc2Vfc2VucyRDQ19GUl9JbmdyZXNvX1RlcmMKYmFzZV92YWxpZGF0aW9uJExvZ19MYWJfR0JfVGVyYyA8LSBiYXNlX3NlbnMkTG9nX0xhYl9HQl9UZXJjCmJhc2VfdmFsaWRhdGlvbiRMb2dfVEFTX1RlcmMgPC0gYmFzZV9zZW5zJExvZ19UQVNfVGVyYwpiYXNlX3ZhbGlkYXRpb24kTG9nX0ZDX1RlcmMgIDwtIGJhc2Vfc2VucyRMb2dfRkNfVGVyYwoKYmFzZV92YWxpZGF0aW9uJHNhbmdyYWRvX3JlY29kIDwtIGJhc2VfaW1wJENvbXBsX1NhbmdfVG9kb3MKYmFzZV92YWxpZGF0aW9uJHNhbmdyYWRvX3JlY29kIDwtIGFzLmZhY3RvcihiYXNlX3ZhbGlkYXRpb24kc2FuZ3JhZG9fcmVjb2QpCgpiYXNlX3ZhbGlkYXRpb24kTGFiX1BsYXFfQ29ydGUgPC0gaWZlbHNlIChiYXNlX3ZhbGlkYXRpb24kTGFiX1BsYXEgPD0gMTAwMDAwLCAxLCAwKQpiYXNlX3ZhbGlkYXRpb24kUGFjX0VkYWRfQ29ydGUgPC0gaWZlbHNlIChiYXNlX3ZhbGlkYXRpb24kUGFjX0VkYWQgPj0gNzUsIDEsIDApCgpiYXNlX3ZhbGlkYXRpb24xIDwtIGJhc2VfdmFsaWRhdGlvbgpiYXNlX3ZhbGlkYXRpb24xMSA8LSBiYXNlX3ZhbGlkYXRpb24KCmxpYnJhcnkoY2FyZXQpCgpmaXRDb250cm9sIDwtIHRyYWluQ29udHJvbCgKICBtZXRob2QgPSAiTE9PQ1YiLCAjbGVhdmUgb25lIG91dCBjcm9zcyB2YWxpZGF0aW9uCiAgY2xhc3NQcm9icyA9IFQsCiAgc3VtbWFyeUZ1bmN0aW9uID0gdHdvQ2xhc3NTdW1tYXJ5ICkKCgpMT09DVl9tNyA9IHRyYWluKAogIGZvcm0gPSBzYW5ncmFkb19yZWNvZCB+IFBhY19BQ1ZnbG9iYWwgKyBQYWNfSGVtb3JyYWdpYV9QcmV2aWFfTWF5b3JfVG9kYXMgKyBQYWNfSVJDZ2xvYmFsICsgUGFjX0N4X1RvdGFsICsgRUNPVFRfRGlzZlZEICsgTGFiX0hiICsgTG9nX0xhYl9HQl9UZXJjICsgTG9nX1RBU19UZXJjICsgTG9nX0ZDX1RlcmMsCiAgZGF0YSA9IGJhc2VfdmFsaWRhdGlvbjExLAogIHRyQ29udHJvbCA9IGZpdENvbnRyb2wsCiAgbWV0aG9kID0gImdsbSIsCiAgZmFtaWx5ID0gImJpbm9taWFsIiwKICBtZXRyaWMgPSAiUk9DIikKCkxPT0NWX203JHByZWQKTE9PQ1ZfbTckcmVzdWx0cyAgI3NhbGVuIGFsIHJldmVzIHNlbnNpYmlsaWRhZCB5IGVzcGVjaWZpY2lkYWQKTE9PQ1ZfbTckcHJlZAoKIyBjYWxjdWxhbW9zIHRvZGFzIGxhcyBtZXRyaWNhcwpyb2NfTE9PQ1ZfbTc8LSByb2MoYmFzZV92YWxpZGF0aW9uMSRzYW5ncmFkb19yZWNvZCB+IExPT0NWX203JHByZWRbICwgNF0sIGF1Yz1UUlVFLCBjaT1UUlVFLCBwbG90PUZBTFNFKQoKUnRhX3ByZWRpY2hhX0xPT0NWX203IDwtIGlmZWxzZShMT09DVl9tNyRwcmVkWyw0XT4wLjMsIDEsIDApCgp0YWJsZShiYXNlX3ZhbGlkYXRpb24xJHNhbmdyYWRvX3JlY29kICwgUnRhX3ByZWRpY2hhX0xPT0NWX203KQoKdGFibGUoYmFzZV9pbXAkQ29tcGxfU2FuZ19Ub2RvcywgUnRhX3ByZWRpY2hhX0xPT0NWX203KQpSdGFfcHJlZGljaGFfTE9PQ1ZfbTcgPC0gYXMuZmFjdG9yKFJ0YV9wcmVkaWNoYV9MT09DVl9tNykKbGV2ZWxzKFJ0YV9wcmVkaWNoYV9MT09DVl9tNykgPC0gYygiTm8iLCAiU2kiKQpiYXNlX2ltcCRDb21wbF9TYW5nX1RvZG9zIDwtIGFzLmZhY3RvcihiYXNlX2ltcCRDb21wbF9TYW5nX1RvZG9zKQpsZXZlbHMoYmFzZV9pbXAkQ29tcGxfU2FuZ19Ub2RvcykgPC0gYygiTm8iLCAiU2kiKQp0YWJsZShiYXNlX2ltcCRDb21wbF9TYW5nX1RvZG9zLCBSdGFfcHJlZGljaGFfTE9PQ1ZfbTcpCgpMT09DVl9tN19zZW5zaWJpbGlkYWQgPC0gY2FyZXQ6OnNlbnNpdGl2aXR5KGJhc2VfaW1wJENvbXBsX1NhbmdfVG9kb3MgLCBSdGFfcHJlZGljaGFfTE9PQ1ZfbTcsIHBvc2l0aXZlPSJTaSIsIG5lZ2F0aXZlID0gIk5vIikKTE9PQ1ZfbTdfZXNwZWNpZmljaWRhZCA8LSBjYXJldDo6c3BlY2lmaWNpdHkoYmFzZV9pbXAkQ29tcGxfU2FuZ19Ub2RvcyAsIFJ0YV9wcmVkaWNoYV9MT09DVl9tNywgcG9zaXRpdmU9IlNpIiwgbmVnYXRpdmUgPSAiTm8iKQpMT09DVl9tN19BVUNST0MgPC0gcm9jX0xPT0NWX203JGF1YwpMT09DVl9tN19hY2N1cmFjeSA8LSBtZWFuKGJhc2VfaW1wJENvbXBsX1NhbmdfVG9kb3MgPT0gUnRhX3ByZWRpY2hhX0xPT0NWX203KQpMT09DVl9tN19wcmVjaXNpb24gPC0gY2FyZXQ6OnByZWNpc2lvbihiYXNlX2ltcCRDb21wbF9TYW5nX1RvZG9zLFJ0YV9wcmVkaWNoYV9MT09DVl9tNykKTE9PQ1ZfbTdfVlBOIDwtIGNhcmV0OjpuZWdQcmVkVmFsdWUoYmFzZV9pbXAkQ29tcGxfU2FuZ19Ub2RvcyxSdGFfcHJlZGljaGFfTE9PQ1ZfbTcpCkxPT0NWX203X1RGUCA8LSAxLUxPT0NWX203X2VzcGVjaWZpY2lkYWQKCnBsb3QoTE9PQ1ZfbTckZmluYWxNb2RlbCkKCmBgYAoKIyMjIGIpIE1vZGVsbyBkZSByZWdyZXNpw7NuIGxvZ2lzdGljYSBlbiBiYXNlIGEgc2VsZWNjacOzbiBkZSB2YXJpYWJsZXMgY29uIG3DqXRvZG8gZGUgTGFzc28KPiBVdGlsaXphbW9zIGxhcyB2YXJpYWJsZXMgY3VhbnRpdGF0aXZhcyBxdWUgY3VtcGxlbiBjb24gY3JpdGVyaW8gZGUgbGluZWFsaWRhZCBkZSBsb2dpdHMKRW4gZWwgY2FzbyBkZSBsYXMgdmFyaWFibGVzIEZDLCBUQVMsIFNhdE8yIHkgR0IgdXNhbW9zIGxhcyB2YXJpYWJsZXMgdHJhbnNmb3JtYWRhcy4KCmBgYHtyfQoKYmFzZV92YWxpZGF0aW9uJENDX0ZSX0luZ3Jlc29fVGVyYyA8LSBiYXNlX3NlbnMkQ0NfRlJfSW5ncmVzb19UZXJjCmJhc2VfdmFsaWRhdGlvbiRMb2dfTGFiX0dCX1RlcmMgPC0gYmFzZV9zZW5zJExvZ19MYWJfR0JfVGVyYwpiYXNlX3ZhbGlkYXRpb24kTG9nX1RBU19UZXJjIDwtIGJhc2Vfc2VucyRMb2dfVEFTX1RlcmMKYmFzZV92YWxpZGF0aW9uJExvZ19GQ19UZXJjICA8LSBiYXNlX3NlbnMkTG9nX0ZDX1RlcmMKYmFzZV92YWxpZGF0aW9uJExvZ19DQ19TYU9fSW5ncmVzbyA8LSBiYXNlX2xvZ2l0MiRMb2dfQ0NfU2FPX0luZ3Jlc28KCmJhc2VfdmFsaWRhdGlvbjIgPC0gYmFzZV92YWxpZGF0aW9uCgpmaXRDb250cm9sIDwtIHRyYWluQ29udHJvbCgKICBtZXRob2QgPSAiTE9PQ1YiLCAjbGVhdmUgb25lIG91dCBjcm9zcyB2YWxpZGF0aW9uCiAgY2xhc3NQcm9icyA9IFQsCiAgc3VtbWFyeUZ1bmN0aW9uID0gdHdvQ2xhc3NTdW1tYXJ5ICkKCgpMT09DVl9tNj0gdHJhaW4oCiAgZm9ybSA9IHNhbmdyYWRvX3JlY29kIH4gUGFjX0FDVmdsb2JhbCArIFBhY19IZW1vcnJhZ2lhX1ByZXZpYV9NYXlvcl9Ub2RhcyArIEJpb21hcmNfcG9zICsgTGFiX0hiICsgTG9nX0xhYl9HQl9UZXJjICsgRUNPVFRfVEFQU0UgKyBMb2dfRkNfVGVyYyArIExvZ19UQVNfVGVyYyArIExvZ19DQ19TYU9fSW5ncmVzbyArIFBhY19DeF9Ub3RhbCwKICBkYXRhID0gYmFzZV92YWxpZGF0aW9uMiwKICB0ckNvbnRyb2wgPSBmaXRDb250cm9sLAogIG1ldGhvZCA9ICJnbG0iLAogIGZhbWlseSA9ICJiaW5vbWlhbCIsCiAgbWV0cmljID0gIlJPQyIKKQoKIyBMYSBtw6l0cmljYSBwb3IgZGVmZWN0byBlcyBhY2N1cmFjeS4gU2UgcHVlZGVuIHNldGVhciBvdHJhcyBjb21vIFJPQyB5IHNlIHB1ZWRlbiBjcmVhciBsYXMgcHJvcGlhcwojIENvbW8gYWNhIG5vIGVzdGFtb3MgdHVuZWFuZG8gbmluZ3VuIHBhcmFtZXRybywgcG9kZW1vcyB1c2FyIGxhcyBwcm9wYWJpbGlkYWRlcyBwcmVkaWNoYXMgZmluYWxlcyBkZWwgTE9PQ1YKIyBDb24gbGFzIHByb2JhYmlsaWRhZGVzIHByZWRpY2hhcyBwb2RlbW9zIGhhY2VyIGxvIHF1ZSBub3MgdmVuZ2EgbWVqb3IKIyBTaSB1c2Ftb3Mgb3Ryb3MgYWxnb3JpdG1vcy9tZXRvZG9zIGR1cmFudGUgZWwgcHJvY2VzbyBkZSB0cmFpbiBzZSBhanVzdGFuIHBhcmFtZXRyb3MgaXRlcmF0aXZhbWVudGUgeSBhaGkgbGEgbcOpdHJpY2EgcXVlCiMgc2UgcG9uZSAoYWNhICJST0MiKSB0aWVuZSBtYXMgcGVzby4KCiMgUGFyYSB2ZXIgZWwgcmVzdWx0YWRvIHNvbG8gYmFzdGEgY29uIHBvbmVyIGVsIG5vbWJyZSBkZWwgb2JqZXRvCgpMT09DVl9tNgpMT09DVl9tNiRyZXN1bHRzCkxPT0NWX202JHByZWQKIyBhY2EgY29tbyBlbGVnaW1vcyBMT09DViBoYXkgdW4gdmFsb3IgcHJlZGljaG8gcGFyYSBjYWRhIHVubywgc2kgZWxlZ2ltb3Mgay1mb2xkLUNWIGVsIHJlc3VsdGFkbyBlcyB1biBtZWRpZGEgY29uIHN1IFNECgojIGFob3JhIGNhbGN1bGFtb3MgdG9kYXMgbGFzIG1ldHJpY2FzCgpyb2NfTE9PQ1ZfbTY8LSByb2MoYmFzZV92YWxpZGF0aW9uMiRzYW5ncmFkb19yZWNvZCAgfiBMT09DVl9tNiRwcmVkWyw0XSwgYXVjPVRSVUUsIGNpPVRSVUUsIHBsb3Q9RkFMU0UpCgpSdGFfcHJlZGljaGFfTE9PQ1ZfbTYgPC0gaWZlbHNlKExPT0NWX202JHByZWRbLDRdPjAuMywgMSwgMCkKCnRhYmxlKGJhc2VfaW1wJENvbXBsX1NhbmdfVG9kb3MsIFJ0YV9wcmVkaWNoYV9MT09DVl9tNikKUnRhX3ByZWRpY2hhX0xPT0NWX202IDwtIGFzLmZhY3RvcihSdGFfcHJlZGljaGFfTE9PQ1ZfbTYpCmxldmVscyhSdGFfcHJlZGljaGFfTE9PQ1ZfbTYpIDwtIGMoIk5vIiwgIlNpIikKYmFzZV9pbXAkQ29tcGxfU2FuZ19Ub2RvcyA8LSBhcy5mYWN0b3IoYmFzZV9pbXAkQ29tcGxfU2FuZ19Ub2RvcykKbGV2ZWxzKGJhc2VfaW1wJENvbXBsX1NhbmdfVG9kb3MpIDwtIGMoIk5vIiwgIlNpIikKdGFibGUoYmFzZV9pbXAkQ29tcGxfU2FuZ19Ub2RvcywgUnRhX3ByZWRpY2hhX0xPT0NWX202KQoKTE9PQ1ZfbTZfc2Vuc2liaWxpZGFkIDwtIGNhcmV0OjpzZW5zaXRpdml0eShiYXNlX2ltcCRDb21wbF9TYW5nX1RvZG9zICwgUnRhX3ByZWRpY2hhX0xPT0NWX202LCBwb3NpdGl2ZT0iU2kiLCBuZWdhdGl2ZSA9ICJObyIpCkxPT0NWX202X2VzcGVjaWZpY2lkYWQgPC0gY2FyZXQ6OnNwZWNpZmljaXR5KGJhc2VfaW1wJENvbXBsX1NhbmdfVG9kb3MgLCBSdGFfcHJlZGljaGFfTE9PQ1ZfbTYsIHBvc2l0aXZlPSJTaSIsIG5lZ2F0aXZlID0gIk5vIikKTE9PQ1ZfbTZfQVVDUk9DIDwtIHJvY19MT09DVl9tNiRhdWMKTE9PQ1ZfbTZfYWNjdXJhY3kgPC0gbWVhbihiYXNlX2ltcCRDb21wbF9TYW5nX1RvZG9zID09IFJ0YV9wcmVkaWNoYV9MT09DVl9tNikKTE9PQ1ZfbTZfcHJlY2lzaW9uIDwtIGNhcmV0OjpwcmVjaXNpb24oYmFzZV9pbXAkQ29tcGxfU2FuZ19Ub2RvcyxSdGFfcHJlZGljaGFfTE9PQ1ZfbTYpCkxPT0NWX202X1ZQTiA8LSBjYXJldDo6bmVnUHJlZFZhbHVlKGJhc2VfaW1wJENvbXBsX1NhbmdfVG9kb3MsUnRhX3ByZWRpY2hhX0xPT0NWX202KQpMT09DVl9tNl9URlAgPC0gMS1MT09DVl9tNl9lc3BlY2lmaWNpZGFkCnBsb3QoTE9PQ1ZfbTYkZmluYWxNb2RlbCkKCgoKYGBgCgojIyMgYykgTW9kZWxvIGRlIHJlZ3Jlc2nDs24gbG9naXN0aWNhIGVuIGJhc2UgYSBSYW5kb20gRm9yZXN0Cj4gVXRpbGl6YW1vcyBsYXMgdmFyaWFibGVzIGN1YW50aXRhdGl2YXMgcXVlIGN1bXBsZW4gY29uIGNyaXRlcmlvIGRlIGxpbmVhbGlkYWQgZGUgbG9naXRzCkVuIGVsIGNhc28gZGUgbGFzIHZhcmlhYmxlcyBGQywgVEFTLCBTYXRPMiB5IEdCIHVzYW1vcyBsYXMgdmFyaWFibGVzIHRyYW5zZm9ybWFkYXMuCgpgYGB7cn0KYmFzZV92YWxpZGF0aW9uJENDX0ZSX0luZ3Jlc29fVGVyYyA8LSBiYXNlX3NlbnMkQ0NfRlJfSW5ncmVzb19UZXJjCmJhc2VfdmFsaWRhdGlvbiRMb2dfTGFiX0dCX1RlcmMgPC0gYmFzZV9zZW5zJExvZ19MYWJfR0JfVGVyYwpiYXNlX3ZhbGlkYXRpb24kTG9nX1RBU19UZXJjIDwtIGJhc2Vfc2VucyRMb2dfVEFTX1RlcmMKYmFzZV92YWxpZGF0aW9uJExvZ19GQ19UZXJjICA8LSBiYXNlX3NlbnMkTG9nX0ZDX1RlcmMKYmFzZV92YWxpZGF0aW9uJExvZ19DQ19TYU9fSW5ncmVzbyA8LSBiYXNlX2xvZ2l0MiRMb2dfQ0NfU2FPX0luZ3Jlc28KCmJhc2VfdmFsaWRhdGlvbjMgPC0gYmFzZV92YWxpZGF0aW9uCgpMT09DVl9tOXJmID0gdHJhaW4oCiAgZm9ybSA9IHNhbmdyYWRvX3JlY29kIH4gTGFiX0hiICsgTG9nX0ZDX1RlcmMgKyBFQ09UVF9QU0FQICsgTG9nX1RBU19UZXJjICsgUGFjX0N4X1RvdGFsICsgTG9nX0NDX1NhT19JbmdyZXNvICsgTG9nX0xhYl9HQl9UZXJjLAogIGRhdGEgPSBiYXNlX3ZhbGlkYXRpb24zLAogIHRyQ29udHJvbCA9IGZpdENvbnRyb2wsCiAgbWV0aG9kID0gImdsbSIsCiAgZmFtaWx5ID0gImJpbm9taWFsIiwKICBtZXRyaWMgPSAiUk9DIgopCgojIG51ZXZhbWVudGUgZXh0cmFlbW9zIGxhcyBwcm9iYWJpbGlkYWRlcyB5IGNhbGN1bGFtb3MgbGFzIG1ldHJpY2FzCgpyb2NfTE9PQ1ZfbTlyZjwtIHJvYyhiYXNlX3ZhbGlkYXRpb24zJHNhbmdyYWRvX3JlY29kICB+IExPT0NWX205cmYkcHJlZFssNF0sIGF1Yz1UUlVFLCBjaT1UUlVFLCBwbG90PUZBTFNFKQoKUnRhX3ByZWRpY2hhX0xPT0NWX205cmYgPC0gaWZlbHNlKExPT0NWX205cmYkcHJlZFssNF0+MC4zLCAxLCAwKQojUnRhX3ByZWRpY2hhX0xPT0NWX205cmYgPC0gYXMuZmFjdG9yKFJ0YV9wcmVkaWNoYV9MT09DVl9tOXJmKQoKdGFibGUoYmFzZV9pbXAkQ29tcGxfU2FuZ19Ub2RvcywgUnRhX3ByZWRpY2hhX0xPT0NWX205cmYpClJ0YV9wcmVkaWNoYV9MT09DVl9tOXJmIDwtIGFzLmZhY3RvcihSdGFfcHJlZGljaGFfTE9PQ1ZfbTlyZikKbGV2ZWxzKFJ0YV9wcmVkaWNoYV9MT09DVl9tOXJmKSA8LSBjKCJObyIsICJTaSIpCmJhc2VfaW1wJENvbXBsX1NhbmdfVG9kb3MgPC0gYXMuZmFjdG9yKGJhc2VfaW1wJENvbXBsX1NhbmdfVG9kb3MpCmxldmVscyhiYXNlX2ltcCRDb21wbF9TYW5nX1RvZG9zKSA8LSBjKCJObyIsICJTaSIpCnRhYmxlKGJhc2VfaW1wJENvbXBsX1NhbmdfVG9kb3MsIFJ0YV9wcmVkaWNoYV9MT09DVl9tOXJmKQoKTE9PQ1ZfbTlyZl9zZW5zaWJpbGlkYWQgPC0gY2FyZXQ6OnNlbnNpdGl2aXR5KGJhc2VfaW1wJENvbXBsX1NhbmdfVG9kb3MgLCBSdGFfcHJlZGljaGFfTE9PQ1ZfbTlyZiwgcG9zaXRpdmU9IlNpIiwgbmVnYXRpdmUgPSAiTm8iKQpMT09DVl9tOXJmX2VzcGVjaWZpY2lkYWQgPC0gY2FyZXQ6OnNwZWNpZmljaXR5KGJhc2VfaW1wJENvbXBsX1NhbmdfVG9kb3MgLCBSdGFfcHJlZGljaGFfTE9PQ1ZfbTlyZiwgcG9zaXRpdmU9IlNpIiwgbmVnYXRpdmUgPSAiTm8iKQpMT09DVl9tOXJmX0FVQ1JPQyA8LSByb2NfTE9PQ1ZfbTlyZiRhdWMKTE9PQ1ZfbTlyZl9hY2N1cmFjeSA8LSBtZWFuKGJhc2VfaW1wJENvbXBsX1NhbmdfVG9kb3MgPT0gUnRhX3ByZWRpY2hhX0xPT0NWX205cmYpCkxPT0NWX205cmZfcHJlY2lzaW9uIDwtIGNhcmV0OjpwcmVjaXNpb24oYmFzZV9pbXAkQ29tcGxfU2FuZ19Ub2RvcyxSdGFfcHJlZGljaGFfTE9PQ1ZfbTlyZikKTE9PQ1ZfbTlyZl9WUE4gPC0gY2FyZXQ6Om5lZ1ByZWRWYWx1ZShiYXNlX2ltcCRDb21wbF9TYW5nX1RvZG9zLFJ0YV9wcmVkaWNoYV9MT09DVl9tOXJmKQpMT09DVl9tOXJmX1RGUCA8LSAxLUxPT0NWX205cmZfZXNwZWNpZmljaWRhZAoKcGxvdChMT09DVl9tOXJmJGZpbmFsTW9kZWwpCgpgYGAKCiMjIyBkKSBNb2RlbG8gZGUgcmVncmVzacOzbiBsb2fDrXN0aWNhIHV0aWxpemFuZG8gdmFyaWFibGVzIGRlIFJhbmRvbSBGb3Jlc3QsIExhc3NvLCBVbml2YXJpYWRvIHkgb3RyYXMgdmFyaWFibGVzIGFwb3lhZGFzIHBvciBsYSBiaWJsaW9ncmFmw61hCgo+IEVuIGVzdGUgY2FzbyB1dGlsaXphcmVtb3MgRWRhZCA+NzUgYcOxb3MgeSBQbGFxdWV0YXMgPDEwMC4wMDAgY29tbyBwdW50byBkZSBjb3J0ZQoKYGBge3J9CmJhc2VfdmFsaWRhdGlvbiRDQ19GUl9JbmdyZXNvX1RlcmMgPC0gYmFzZV9zZW5zJENDX0ZSX0luZ3Jlc29fVGVyYwpiYXNlX3ZhbGlkYXRpb24kTG9nX0xhYl9HQl9UZXJjIDwtIGJhc2Vfc2VucyRMb2dfTGFiX0dCX1RlcmMKYmFzZV92YWxpZGF0aW9uJExvZ19UQVNfVGVyYyA8LSBiYXNlX3NlbnMkTG9nX1RBU19UZXJjCmJhc2VfdmFsaWRhdGlvbiRMb2dfRkNfVGVyYyAgPC0gYmFzZV9zZW5zJExvZ19GQ19UZXJjCmJhc2VfdmFsaWRhdGlvbiRMb2dfQ0NfU2FPX0luZ3Jlc28gPC0gYmFzZV9sb2dpdDIkTG9nX0NDX1NhT19JbmdyZXNvCgpiYXNlX3ZhbGlkYXRpb240IDwtIGJhc2VfdmFsaWRhdGlvbgoKTE9PQ1ZfbTg9IHRyYWluKAogIGZvcm0gPSBzYW5ncmFkb19yZWNvZCB+IFBhY19JUkNnbG9iYWwgICsgUGFjX0VkYWRfQ29ydGUgKyBMYWJfUGxhcV9Db3J0ZSArIFBhY19IZW1vcnJhZ2lhX1ByZXZpYV9NYXlvcl9SZWNpZW50ZSArIFBhY19DeF9Ub3RhbCArIExhYl9IYiwKICBkYXRhID0gYmFzZV92YWxpZGF0aW9uNCwKICB0ckNvbnRyb2wgPSBmaXRDb250cm9sLAogIG1ldGhvZCA9ICJnbG0iLAogIGZhbWlseSA9ICJiaW5vbWlhbCIsCiAgbWV0cmljID0gIlJPQyIKKQoKTE9PQ1ZfbTgKTE9PQ1ZfbTgkcmVzdWx0cyAgI3NhbGVuIGFsIHJldmVzIHNlbnNpYmlsaWRhZCB5IGVzcGVjaWZpY2lkYWQKTE9PQ1ZfbTgkcHJlZAoKIyBjYWxjdWxhbW9zIHRvZGFzIGxhcyBtZXRyaWNhcwoKcm9jX0xPT0NWX204PC0gcm9jKGJhc2VfdmFsaWRhdGlvbjQkc2FuZ3JhZG9fcmVjb2QgIH4gTE9PQ1ZfbTgkcHJlZFssNF0sIGF1Yz1UUlVFLCBjaT1UUlVFLCBwbG90PUZBTFNFKQoKUnRhX3ByZWRpY2hhX0xPT0NWX204IDwtIGlmZWxzZShMT09DVl9tOCRwcmVkWyw0XT4wLjMsIDEsIDApCgp0YWJsZShiYXNlX2ltcCRDb21wbF9TYW5nX1RvZG9zLCBSdGFfcHJlZGljaGFfTE9PQ1ZfbTgpClJ0YV9wcmVkaWNoYV9MT09DVl9tOCA8LSBhcy5mYWN0b3IoUnRhX3ByZWRpY2hhX0xPT0NWX204KQpsZXZlbHMoUnRhX3ByZWRpY2hhX0xPT0NWX204KSA8LSBjKCJObyIsICJTaSIpCmJhc2VfaW1wJENvbXBsX1NhbmdfVG9kb3MgPC0gYXMuZmFjdG9yKGJhc2VfaW1wJENvbXBsX1NhbmdfVG9kb3MpCmxldmVscyhiYXNlX2ltcCRDb21wbF9TYW5nX1RvZG9zKSA8LSBjKCJObyIsICJTaSIpCnRhYmxlKGJhc2VfaW1wJENvbXBsX1NhbmdfVG9kb3MsIFJ0YV9wcmVkaWNoYV9MT09DVl9tOCkKCkxPT0NWX204X3NlbnNpYmlsaWRhZCA8LSBjYXJldDo6c2Vuc2l0aXZpdHkoYmFzZV9pbXAkQ29tcGxfU2FuZ19Ub2RvcyAsIFJ0YV9wcmVkaWNoYV9MT09DVl9tOCwgcG9zaXRpdmU9IlNpIiwgbmVnYXRpdmUgPSAiTm8iKQpMT09DVl9tOF9lc3BlY2lmaWNpZGFkIDwtIGNhcmV0OjpzcGVjaWZpY2l0eShiYXNlX2ltcCRDb21wbF9TYW5nX1RvZG9zICwgUnRhX3ByZWRpY2hhX0xPT0NWX204LCBwb3NpdGl2ZT0iU2kiLCBuZWdhdGl2ZSA9ICJObyIpCkxPT0NWX204X0FVQ1JPQyA8LSByb2NfTE9PQ1ZfbTgkYXVjCkxPT0NWX204X2FjY3VyYWN5IDwtIG1lYW4oYmFzZV9pbXAkQ29tcGxfU2FuZ19Ub2RvcyA9PSBSdGFfcHJlZGljaGFfTE9PQ1ZfbTgpCkxPT0NWX204X3ByZWNpc2lvbiA8LSBjYXJldDo6cHJlY2lzaW9uKGJhc2VfaW1wJENvbXBsX1NhbmdfVG9kb3MsUnRhX3ByZWRpY2hhX0xPT0NWX204KQpMT09DVl9tOF9WUE4gPC0gY2FyZXQ6Om5lZ1ByZWRWYWx1ZShiYXNlX2ltcCRDb21wbF9TYW5nX1RvZG9zLFJ0YV9wcmVkaWNoYV9MT09DVl9tOCkKTE9PQ1ZfbThfVEZQIDwtIDEtTE9PQ1ZfbThfZXNwZWNpZmljaWRhZAoKCnBsb3QoTE9PQ1ZfbTgkZmluYWxNb2RlbCkKCgpgYGAKCgojIyMgZSkgTW9kZWxvIGFkaXRpdm8gZ2VuZXJhbGl6YWRvOiBHQU0KPkVuIGVzdGUgbW9kZWxvIGludGVudGFyZW1vcyBpbmNsdWlyIEVkYWQsIFBsYXF1ZXRhcyB5IENsQ3IgcXVlIG5vIGN1bXBsZW4gY29uIGxpbmVhbGlkYWQgZGUgbG9naXRzLgpBZGVtw6FzIGludGVudGFyZW1vcyBtb2RlbGFyIGxhcyB2YXJpYWJsZXMgc2luIHRyYW5zZm9ybWFyIGRlIEdCIHkgVEFTLCBGQyB5IFNhdE8yIHkgRlIuIAoKIyMjIyBpKSBFeHBsb3JhY2nDs24gZGUgbGFzIHZhcmlhYmxlcyBubyBsaW5lYWxlcwpgYGB7cn0KYmFzZV9nYW0gPC0gYmFzZV9iYWNrdXAKCmxpYnJhcnkoZ2FtbHNzKQpsaWJyYXJ5KGdncHVicikKbGlicmFyeShza2ltcikKCmdncGxvdChkYXRhID0gYmFzZV9nYW0sIGFlcyh4ID0gTGFiX0hiKSkgKwogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSwgZmlsbCA9ICJncmF5NTAiKSArCiAgZ2VvbV9ydWcoYWxwaGEgPSAwLjIpICsKICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgSGIiKSArCiAgdGhlbWVfYncoKQoKZ2dwbG90KGRhdGEgPSBiYXNlX2dhbSwgYWVzKHggPSBDbENyKSkgKwogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSwgZmlsbCA9ICJncmF5NTAiKSArCiAgZ2VvbV9ydWcoYWxwaGEgPSAwLjIpICsKICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgQ2xDciIpICsKICB0aGVtZV9idygpCgpnZ3Bsb3QoZGF0YSA9IGJhc2VfZ2FtLCBhZXMoeCA9IExhYl9QbGFxKSkgKwogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSwgZmlsbCA9ICJncmF5NTAiKSArCiAgZ2VvbV9ydWcoYWxwaGEgPSAwLjIpICsKICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgUGxhcSIpICsKICB0aGVtZV9idygpCgpnZ3Bsb3QoZGF0YSA9IGJhc2VfZ2FtLCBhZXMoeCA9IExhYl9HQikpICsKICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUsIGZpbGwgPSAiZ3JheTUwIikgKwogIGdlb21fcnVnKGFscGhhID0gMC4yKSArCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidWNpw7NuIGRlIEdCIikgKwogIHRoZW1lX2J3KCkKCmdncGxvdChkYXRhID0gYmFzZV9nYW0sIGFlcyh4ID0gUGFjX0VkYWQpKSArCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC41LCBmaWxsID0gImdyYXk1MCIpICsKICBnZW9tX3J1ZyhhbHBoYSA9IDAuMikgKwogIGxhYnModGl0bGUgPSAiRGlzdHJpYnVjacOzbiBkZSBFZGFkIikgKwogIHRoZW1lX2J3KCkKCiNNb2RlbG8gYsOhc2ljbyBkZSByZWdyZXNpw7NuIGxvZ2lzdGljYSwgc2luIHNtb290aHMsIHBhcmEgcG9kZXIgY29tcGFyYXIgZGVzcHXDqXMKYmFzZV9nYW0kQ29tcGxfU2FuZ19Ub2RvcyA8LSBhcy5pbnRlZ2VyKGJhc2VfZ2FtJENvbXBsX1NhbmdfVG9kb3MpIC0xIAptb2RlbG9fZ2xtIDwtIGdhbWxzcygKICAgICAgICAgICAgICBmb3JtdWxhID0gQ29tcGxfU2FuZ19Ub2RvcyB+ICBDQ19UQVNfSW5ncmVzbyArIChDbENyKSArIChMYWJfSGIpICsgTGFiX1BsYXEgKyBQYWNfRWRhZCArIENDX1NhT19JbmdyZXNvICsgQ0NfRkNfSW5ncmVzbyArIExhYl9HQiwKICAgICAgICAgICAgICBmYW1pbHkgID0gQkkobXUubGluayA9ICJsb2dpdCIpLAogICAgICAgICAgICAgIGRhdGEgICAgPSBiYXNlX2dhbSwKICAgICAgICAgICAgICB0cmFjZSAgID0gRkFMU0UKICAgICAgICAgICAgICkKc3VtbWFyeShtb2RlbG9fZ2xtKQpwbG90KG1vZGVsb19nbG0pCndwKG1vZGVsb19nbG0sIHlsaW0uYWxsID0gMSkKCgojRXhwbG9yYWNpb24gZGUgb3RyYXMgZGlzdHJpYnVjaW9uZXMgcXVlIGFqdXN0ZW4gbWVqb3IKYmFzZV9iaW5vbSA8LSBiYXNlX2dhbVssbmFtZXMoYmFzZV9nYW0pICVpbiUgYygiQ29tcGxfU2FuZ19Ub2RvcyIsICJCaW9tYXJjX3BvcyIgLCAiRUNPVFRfRGlzZlZEIiwgIkNsQ3IiLCAiTGFiX0hiIiwgIkxhYl9HQiIsICJQYWNfRWRhZCIsICJDQ19GQ19JbmdyZXNvIiwgIkNDX1RBU19JbmdyZXNvIiwgIkNDX1NhT19JbmdyZXNvIiwgIlBhY19BQ1ZnbG9iYWwiLCAiUGFjX0N4X1RvdGFsIiwgIlBhY19IZW1vcnJhZ2lhX1ByZXZpYV9NYXlvcl9Ub2RhcyIpXQoKZGlzdHJpYnVjaW9uZXMgPC0gZml0RGlzdCgKICAgICAgICAgICAgICAgICAgICBiYXNlX2Jpbm9tJENvbXBsX1NhbmdfVG9kb3MsCiAgICAgICAgICAgICAgICAgICAgayA9IDIsICMgZXN0YSBwZW5hbGl6YWNpw7NuIGVxdWl2YWxlIGFsIEFJQwogICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiYmlub20iLAogICAgICAgICAgICAgICAgICAgIHRyYWNlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgdHJ5LmdhbWxzcyA9IFRSVUUKICAgICAgICAgICAgICAgICAgKQpkaXN0cmlidWNpb25lcyRmaXRzICU+JQogIGVuZnJhbWUobmFtZSA9ICJkaXN0cmlidWNpb24iLCB2YWx1ZSA9ICJHQUlDIikgJT4lCiAgYXJyYW5nZShHQUlDKQpkaXN0cmlidWNpb25lcwojU2UgZXhwbG9yw7IgY29uIG90cmFzIGRpc3RyaWJ1Y2lvbmVzOiBCQiwgREJJLCBOQkksIE5CSUkuIFBvciBBSUMgZWwgbWVqb3IgbW9kZWxvIGVzIGNvbiBCSS4gCgojQXBsaWNhciBzbW9vdGhpbmcgYSBsYXMgdmFyaWFibGVzIGNvbnRpbnVhcwoKI1AtU3BsaW5lcyAoUGVuYWxpemVkIFNtb290aGluZyBTcGxpbmVzKSBhIGxvcyBwcmVkaWN0b3JlcyBjb250aW51b3MgZGVsIG1vZGVsby4gRXN0YSBmdW5jacOzbiBlbXBsZWEgZWwgbcOpdG9kbyBkZSBsb2NhbCBtYXhpbXVtIGxpa2VsaWhvb2QgcGFyYSBzZWxlY2Npb25hciBhdXRvbcOhdGljYW1lbnRlIGxvcyBncmFkb3MgZGUgbGliZXJ0YWQgZWZlY3Rpdm9zIMOzcHRpbW9zIChmbGV4aWJpbGlkYWQpLgptb2RlbG9fZ2xtMiA8LSBnYW1sc3MoCiAgICAgICAgICAgICAgZm9ybXVsYSA9IENvbXBsX1NhbmdfVG9kb3MgfiAgcGIoQ0NfVEFTX0luZ3Jlc28pICsgcGIoQ2xDcikgKyBwYihMYWJfSGIpICsgcGIoTGFiX1BsYXEpICsgcGIoUGFjX0VkYWQpICsgcGIoQ0NfU2FPX0luZ3Jlc28pICsgcGIoQ0NfRkNfSW5ncmVzbykgKyBwYihMYWJfR0IpLAogICAgICAgICAgICAgIGZhbWlseSAgPSBCSShtdS5saW5rID0gImxvZ2l0IiksCiAgICAgICAgICAgICAgZGF0YSAgICA9IGJhc2VfZ2FtLAogICAgICAgICAgICAgIHRyYWNlICAgPSBGQUxTRQogICAgICAgICAgICAgKQpzdW1tYXJ5KG1vZGVsb19nbG0yKQpwbG90KG1vZGVsb19nbG0yKQp3cChtb2RlbG9fZ2xtMiwgeWxpbS5hbGwgPSAxKQoKI0xhIGZ1bmNpw7NuIGNzKCkgcGVybWl0ZSBpbmNvcnBvcmFyIEN1YmljIFNwbGluZXMgYSBsb3MgcHJlZGljdG9yZXMgY29udGludW9zIGRlbCBtb2RlbG8uIEEgZGlmZXJlbmNpYSBkZSBwYigpLCBlbiBlc3RlIGNhc28gc8OtIGVzIG5lY2VzYXJpbyBlc3BlY2lmaWNhciBsb3MgZ3JhZG9zIGRlIGxpYmVydGFkLgptb2RlbG9fZ2xtNCA8LSBnYW1sc3MoCiAgICAgICAgICAgICAgZm9ybXVsYSA9IENvbXBsX1NhbmdfVG9kb3MgfiAgIGNzKENDX1RBU19JbmdyZXNvLCBkZiA9IDIpICsgY3MoQ2xDciwgZGYgPSAyKSArIGNzKExhYl9IYiwgZGYgPSAyKSArIGNzKExhYl9QbGFxLCBkZiA9IDIpICsgY3MoUGFjX0VkYWQsIGRmID0gMikgKyBjcyhDQ19TYU9fSW5ncmVzbywgZGYgPSAyKSArIGNzKENDX0ZDX0luZ3Jlc28sIGRmID0gMikgKyBjcyhMYWJfR0IsIGRmID0gMiksCiAgICAgICAgICAgICAgZmFtaWx5ICA9IEJJKG11LmxpbmsgPSAibG9naXQiKSwKICAgICAgICAgICAgICBkYXRhICAgID0gYmFzZV9nYW0sCiAgICAgICAgICAgICAgdHJhY2UgICA9IEZBTFNFCiAgICAgICAgICAgICApCnN1bW1hcnkobW9kZWxvX2dsbTQpCnBsb3QobW9kZWxvX2dsbTQpCndwKG1vZGVsb19nbG00LCB5bGltLmFsbCA9IDEpCgoKI0hheSBtw6l0b2RvcyBjb24gcmVkZXMgbmV1cm9uYWxlcyBwYXJhIHNtb290aGluZyBwZXJvIHByZWZlcmltb3Mgbm8gbWV0ZXJub3MgZW4gZXNlIHRlcnJpdG9yaW8KCiMjI1NFTEVDQ0lPTiBERUwgTUVKT1IgTU9ERUxPIyMjCkdBSUMobW9kZWxvX2dsbSwgbW9kZWxvX2dsbTIsbW9kZWxvX2dsbTQpCiNMYSBtZWpvciBmdW5jacOzbiBzbW9vdGggZXMgY29uIEdMTTIsIGVzIGRlY2lyIGNvbiBQLXNwbGluZXMgUGVuYWxpemVkIFNtb290aGluZyBTcGxpbmVzLgoKI0Fob3JhIHNhY2Ftb3MgbGFzIHZhcmlhYmxlcyBxdWUgbm8gc29uIHNpZ25pZmljYXRpdmFzIHkgZXhwbG9yYW1vcyBpbmNsdXllbmRvIGxhcyBjYXRlZ8OzcmljYXM6Cm1vZGVsb19nbG0yXzEgPC0gZ2FtbHNzKAogICAgICAgICAgICAgIGZvcm11bGEgPSBDb21wbF9TYW5nX1RvZG9zIH4gIHBiKENsQ3IpICsgcGIoTGFiX0hiKSArIHBiKExhYl9QbGFxKSArIHBiKENDX0ZDX0luZ3Jlc28pICsgcGIoTGFiX0dCKSwKICAgICAgICAgICAgICBmYW1pbHkgID0gQkkobXUubGluayA9ICJsb2dpdCIpLAogICAgICAgICAgICAgIGRhdGEgICAgPSBiYXNlX2dhbSwKICAgICAgICAgICAgICB0cmFjZSAgID0gRkFMU0UKICAgICAgICAgICAgICkKc3VtbWFyeShtb2RlbG9fZ2xtMl8xKQpwbG90KG1vZGVsb19nbG0yXzEpCndwKG1vZGVsb19nbG0yXzEsIHlsaW0uYWxsID0gMSkKCm1vZGVsb19nbG0yXzIgPC0gZ2FtbHNzKAogICAgICAgICAgICAgIGZvcm11bGEgPSBDb21wbF9TYW5nX1RvZG9zIH4gIHBiKENDX0ZDX0luZ3Jlc28pICsgcGIoTGFiX0hiKSArIEJpb21hcmNfcG9zICsgRUNPVFRfRGlzZlZEICArIHBiKENsQ3IpICsgUGFjX0FDVmdsb2JhbCwKICAgICAgICAgICAgICBmYW1pbHkgID0gQkkobXUubGluayA9ICJsb2dpdCIpLAogICAgICAgICAgICAgIGRhdGEgICAgPSBiYXNlX2dhbSwKICAgICAgICAgICAgICB0cmFjZSAgID0gRkFMU0UKICAgICAgICAgICAgICkKc3VtbWFyeShtb2RlbG9fZ2xtMl8yKQpwbG90KG1vZGVsb19nbG0yXzIpCndwKG1vZGVsb19nbG0yXzIsIHlsaW0uYWxsID0gMSkKCm1vZGVsb19nbG0yXzMgPC0gZ2FtbHNzKAogICAgICAgICAgICAgIGZvcm11bGEgPSBDb21wbF9TYW5nX1RvZG9zIH4gcGIoTGFiX0hiKSArIEJpb21hcmNfcG9zICsgRUNPVFRfRGlzZlZEICArICBQYWNfRWRhZF9Db3J0ZSArIFBhY19BQ1ZnbG9iYWwsCiAgICAgICAgICAgICAgZmFtaWx5ICA9IEJJKG11LmxpbmsgPSAibG9naXQiKSwKICAgICAgICAgICAgICBkYXRhICAgID0gYmFzZV9nYW0sCiAgICAgICAgICAgICAgdHJhY2UgICA9IEZBTFNFCiAgICAgICAgICAgICApCnN1bW1hcnkobW9kZWxvX2dsbTJfMykKcGxvdChtb2RlbG9fZ2xtMl8zKQp3cChtb2RlbG9fZ2xtMl8zLCB5bGltLmFsbCA9IDEpCgojIyNTRUxFQ0NJT04gREVMIE1FSk9SIE1PREVMTyMjIwpHQUlDKG1vZGVsb19nbG0yXzEsIG1vZGVsb19nbG0yXzIsbW9kZWxvX2dsbTJfMykKCiNFbCBtZWpvciBtb2RlbG8gZXM6IG1vZGVsb19nbG0yXzMKCiNDdWFuZG8gc2UgaW5jb3Jwb3JhIGVuIGFsZ8O6biBwcmVkaWN0b3IgZGUgdW4gbW9kZWxvIGFkaXRpdm8gKEdBTSBvIEdBTUxTUykgdW5hIGZ1bmNpw7NuIHNtb290aCwgZWwgY29lZmljaWVudGUgZGUgcmVncmVzacOzbiB5IHN1IGVycm9yIGVzdGltYWRvIG5vIHNlIHB1ZWRlbiBpbnRlcnByZXRhciBkZSBsYSBmb3JtYSBjb252ZW5jaW9uYWwsIHlhIHF1ZSBlc3RvcyBzb2xvIGNvbnRlbXBsYW4gbGEgYXBvcnRhY2nDs24gbGluZWFsLCBpZ25vcmFuZG8gbGEgbm8gbGluZWFsLiBMYSBtZWpvciBmb3JtYSBkZSBpbnRlcnByZXRhciBlbCBpbXBhY3RvIGRlIHVuYSBmdW5jacOzbiBzbW9vdGggbm8gbGluZWFsIGVzIG1lZGlhbnRlOgoKI0dyw6FmaWNvcyBkZSBkZXBlbmRlbmNpYSBwYXJjaWFsLCBxdWUgbXVlc3RyYW4gZWwgaW1wYWN0byBlbiBsYXMgcHJlZGljY2lvbmVzIGRlbCBtb2RlbG8gYSBtZWRpZGEgcXVlIHZhcsOtYSBlbCB2YWxvciBkZSB1biBwcmVkaWN0b3IgeSBzZSBtYW50aWVuZW4gY29uc3RhbnRlcyBsb3Mgb3Ryb3MuCgojZ2V0UEVGKCAgICNubyBzZSBwdWVkZSBwb3JxdWUgc29sYW1lbnRlIGhheSAxIHZhcmlhYmxlIGNvbnRpbnVhCiMgIG1vZGVsb19nbG0yXzMsCiMgIHRlcm0gICAgICA9ICJMYWJfSGIiLAojICBwYXJhbWV0ZXIgPSAibXUiLAojICBwbG90ICAgICAgPSBUUlVFCiMpCgojUmVhanVzdGFyIGVsIG1vZGVsbyBleGNsdXllbmRvIGVsIHByZWRpY3RvciBkZSBpbnRlcsOpcyB5IGV2YWx1YXIgZWwgaW1wYWN0byBxdWUgdGllbmUgc29icmUgZWwgbW9kZWxvLiBkcm9wMSgpCmRyb3AgPC0gZHJvcDEob2JqZWN0ID0gbW9kZWxvX2dsbTJfMywgcGFyYWxsZWwgPSAibXVsdGljb3JlIiwgbmNwdXMgPSA0KQpkcm9wCgpgYGAKPkNvbW8gY29uY2x1c2nDs24gdmVtb3MgcXVlIHByb2JhbmRvIGNvbiBlc3RvcyBtb2RlbG9zIGFkaXRpdm9zIG5vIG9idGVuZW1vcyByZXN1bHRhZG9zIHNpZ25pZmljYXRpdm9zIHBhcmEgUGxhcXVldGFzLCBFZGFkLCBuaSBDbGVhcmVuY2UgZGUgQ3JlYXRpbmluYS4gCgojIyMjIGlpKSBNb2RlbG8gR0FNIGNvbiBjcm9zcyB2YWxpZGF0aW9uCmBgYHtyfQojY3Jvc3MgdmFsaWRhdGlvbiBjb24gbcOpdG9kbyBMZWF2ZSBvbmUgT3V0IHkgR0FNCiNubyBzZSBwdWVkZSB1dGlsaXphciBsYSBsaWJyZXJpYSBHQU1MU1MgeWEgcXVlIHRpZW5lIHVuIGVycm9yIGludGVybm8gZW4gZWwgY8OzZGlnbyBhbCBoYWNlciBDViBjb24gVlIgYmlub21pYWwKI2Rlam8gZWwgc2NyaXB0IHBhcmEgZnV0dXJvcyBpbnRlbnRvcwojbW9kZWxvX2dsbTJfY3YgPC0gZ2FtbHNzQ1YoZm9ybXVsYSA9IENvbXBsX1NhbmdfVG9kb3MgfiBCaW9tYXJjX3BvcyArIEVDT1RUX0Rpc2ZWRCAgKyBwYihDbENyKSArIHBiKExhYl9IYikgKyAoUGFjX0VkYWRfQ29ydGUpICsgUGFjX0FDVmdsb2JhbCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSAgPSBCSSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgICAgPSBiYXNlX2dhbSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgIEsuZm9sZCA9IDEwLCBwYXJhbGxlbCA9ICJtdWx0aWNvcmUiLCBuY3B1cyA9IDQsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQuc2VlZCA9IDEpCgojZWwgQ1YgY29uIGNhcmV0IG5vIHBlcm1pdGUgc2VsZWNjaW9uYXIgZWwgdGlwbyBkZSBzbW9vdGhpbmcgZGUgbGEgdmFyaWFibGUsIGVsaWdlIGVsIHNtb290aGluZyBxdWUgbWVqb3Igc2UgYWRhcHRhIGEgbG9zIGRhdG9zIGRlIGZvcm1hIGF1dG9tw6F0aWNhLgoKbGlicmFyeShtZ2N2KQpsaWJyYXJ5KGNhcmV0KQoKYmFzZV9nYW0kQ29tcGxfU2FuZ19Ub2RvcyA8LSBhcy5mYWN0b3IoYmFzZV9nYW0kQ29tcGxfU2FuZ19Ub2RvcykKbGV2ZWxzKGJhc2VfZ2FtJENvbXBsX1NhbmdfVG9kb3MpIDwtIGMoIk5vIiwgIlNpIikKCnNldC5zZWVkKDApCgpMT09DVl9tMTEgPC0gdHJhaW4oQ29tcGxfU2FuZ19Ub2RvcyB+IEJpb21hcmNfcG9zICsgRUNPVFRfRGlzZlZEICsgTGFiX0hiICsgUGFjX0VkYWRfQ29ydGUgKyBQYWNfQUNWZ2xvYmFsLCAKICAgICAgICBkYXRhID0gYmFzZV9nYW0sCiAgICAgICAgbWV0aG9kID0gImdhbSIsCiAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZCA9ICJMT09DViIsIG51bWJlciA9IDEsIGNsYXNzUHJvYnMgPSBULCBzdW1tYXJ5RnVuY3Rpb24gPSB0d29DbGFzc1N1bW1hcnkpLAogICAgICAgIHR1bmVHcmlkID0gZGF0YS5mcmFtZShtZXRob2QgPSAiR0NWLkNwIiwgc2VsZWN0ID0gRkFMU0UpLAogICAgICAgIGZhbWlseSA9ICJiaW5vbWlhbCIsIG1ldHJpYyA9ICJST0MiCikKCnN1bW1hcnkoTE9PQ1ZfbTExKQoKI0NhbGN1bG8gbWV0cmljYXMgY29uIHJlZ3Jlc2lvbiBsb2dpc3RpY2EgY29uIHNtb290aGluZyBkZSBtb2RlbG8gY29uIGNyb3NzIHZhbGlkYXRpb24KCkxPT0NWX20xMSRwcmVkCgpyb2NfTE9PQ1ZfbTExPC0gcm9jKGJhc2VfZ2FtJENvbXBsX1NhbmdfVG9kb3MgfiBMT09DVl9tMTEkcHJlZFssNF0sIGF1Yz1UUlVFLCBjaT1UUlVFLCBwbG90PVRSVUUpCnBsb3Qocm9jX0xPT0NWX20xMSkKClJ0YV9wcmVkaWNoYV9MT09DVl9tMTEgPC0gaWZlbHNlKGZ2KG1vZGVsb19nbG0yKT4wLjMsIDEsIDApCgp0YWJsZShiYXNlX2dhbSRDb21wbF9TYW5nX1RvZG9zLCBSdGFfcHJlZGljaGFfTE9PQ1ZfbTExKQpSdGFfcHJlZGljaGFfTE9PQ1ZfbTExIDwtIGFzLmZhY3RvcihSdGFfcHJlZGljaGFfTE9PQ1ZfbTExKQpsZXZlbHMoUnRhX3ByZWRpY2hhX0xPT0NWX20xMSkgPC0gYygiTm8iLCAiU2kiKQpiYXNlX2dhbSRDb21wbF9TYW5nX1RvZG9zIDwtIGFzLmZhY3RvcihiYXNlX2dhbSRDb21wbF9TYW5nX1RvZG9zKQpsZXZlbHMoYmFzZV9nYW0kQ29tcGxfU2FuZ19Ub2RvcykgPC0gYygiTm8iLCAiU2kiKQpzdW1tYXJ5KGJhc2VfZ2FtJENvbXBsX1NhbmdfVG9kb3MpCnRhYmxlKGJhc2VfZ2FtJENvbXBsX1NhbmdfVG9kb3MsIFJ0YV9wcmVkaWNoYV9MT09DVl9tMTEpCgojQ2FsY3VsbyBkZSBtZXRyaWNhcwpsaWJyYXJ5KGNhcmV0KQpMT09DVl9tMTFfc2Vuc2liaWxpZGFkIDwtIGNhcmV0OjpzZW5zaXRpdml0eShiYXNlX2dhbSRDb21wbF9TYW5nX1RvZG9zICwgUnRhX3ByZWRpY2hhX0xPT0NWX20xMSwgcG9zaXRpdmU9IlNpIiwgbmVnYXRpdmUgPSAiTm8iKQpMT09DVl9tMTFfZXNwZWNpZmljaWRhZCA8LSBjYXJldDo6c3BlY2lmaWNpdHkoYmFzZV9nYW0kQ29tcGxfU2FuZ19Ub2RvcyAsIFJ0YV9wcmVkaWNoYV9MT09DVl9tMTEsIHBvc2l0aXZlPSJTaSIsIG5lZ2F0aXZlID0gIk5vIikKTE9PQ1ZfbTExX0FVQ1JPQyA8LSByb2NfTE9PQ1ZfbTExJGF1YwpMT09DVl9tMTFfYWNjdXJhY3kgPC0gbWVhbihiYXNlX2dhbSRDb21wbF9TYW5nX1RvZG9zID09IFJ0YV9wcmVkaWNoYV9MT09DVl9tMTEpCkxPT0NWX20xMV9wcmVjaXNpb24gPC0gY2FyZXQ6OnByZWNpc2lvbihiYXNlX2dhbSRDb21wbF9TYW5nX1RvZG9zLFJ0YV9wcmVkaWNoYV9MT09DVl9tMTEpCkxPT0NWX20xMV9WUE4gPC0gY2FyZXQ6Om5lZ1ByZWRWYWx1ZShiYXNlX2dhbSRDb21wbF9TYW5nX1RvZG9zLFJ0YV9wcmVkaWNoYV9MT09DVl9tMTEpCkxPT0NWX20xMV9URlAgPC0gMS1MT09DVl9tMTFfZXNwZWNpZmljaWRhZAoKcGxvdChMT09DVl9tMTEkZmluYWxNb2RlbCkKCgpgYGAKPiBSZXN1bWllbmRvOiBVdGlsaXphbW9zIGxhIGxpYnJlcmlhIEdBTUxTUyB5IGJ1c2NhbW9zIGxhIG1lam9yIGRpc3RyaWJ1Y2nDs24gZW50cmUgbGFzIGRpc3RpbnRhcyBiaW5vbWlhbGVzIHBhcmEgbWkgbW9kZWxvLiBBIHBvc3RlcmlvciBjb21wYXJhbW9zIGxhIHJlZ3Jlc2nDs24gbG9nw61zdGljYSBjb23Dum4gY29uIG3DqXRvZG9zIGRlIHJlZ3Jlc2nDs24gcXVlIGFqdXN0YW4geSBtb2RlbGFuIGxhcyB2YXJpYWJsZXMgY3VhbnRpdGF0aXZhcyBxdWUgbm8gcmVzcGV0YW4gbGEgbGluZWFsaWRhZCBkZSBsb3MgbG9naXRzLCBjb21vIGVzIGVsIGNhc28gZGUgUGxhcXVldGFzIHkgQ2xlYXJlbmNlIGRlIENyZWF0aW5pbmEuCgo+RWwgbWVqb3IgbW9kZWxvIGVuIGJhc2UgYWwgQUlDIGVzIGVsIEdMTTIsIGVzIGRlY2lyIGVsIG1vZGVsbyBxdWUgdXRpbGl6YSBQLXNwbGluZXMgUGVuYWxpemVkIFNtb290aGluZyBTcGxpbmVzLiBBIG1vZG8gZXhwbG9yYXRvcmlvIHJlYWxpemFtb3MgbGFzIG3DqXRyaWNhcyBjb24gZXN0ZSBtb2RlbG8sIHkgbHVlZ28gcmVhbGl6YW1vcyBjb24gbGEgbGlicmVyaWEgY2FyZXQgZWwgbWlzbW8gbW9kZWxvIHV0aWxpemFuZG8gY3Jvc3MtdmFsaWRhdGlvbiBjb24gay1mb2xkID0gMTAgKGludGVudGFtb3MgcmVhbGl6YXIgY3Jvc3MgdmFsaWRhdGlvbiBjb24gZWwgcGFxdWV0ZSBHQU1MU1MgcGVybyBjcmVlbW9zIHF1ZSBoYXkgdW4gcHJvYmxlbWEgY29uIGxhIGxpYnJlcsOtYSBhbCByZWFsaXphciBjcm9zcyB2YWxpZGF0aW9uIGRlIG1vZGVsb3MgYmlub21pYWxlcykKQ29uIGVzZSBtb2RlbG8gY29uIGNyb3NzIHZhbGlkYXRpb24gKG1vZGVsbyAxMSkgcmVhbGl6YW1vcyBsYXMgbcOpdHJpY2FzIHkgYWhvcmEgc2VsZWNjaW9uYXJlbW9zIGVsIG1lam9yIG1vZGVsbyBlbiBsYSBwcsOzeGltYSBzZWNjacOzbi4gCgojIyA5KSAqKk3DqXRyaWNhcyBkZSBwZXJmb21hbmNlIGRlIG1vZGVsb3MgR0FNIHkgbG9nw61zdGljb3MqKgpgYGB7cn0KCm1vZGVsb3MgPC0gYygiUG9yIGFuYWxpc2lzIHVuaXZhcmlhZG8iLCAiUG9yIExhc3NvIiwgIlBvciBSYW5kb20gRm9yZXN0IiwgIlBvciBMYXNzbyArIFJGICsgVW5pdiIsICJHQU0gY29uIENWIikKU2Vuc2liaWxpZGFkIDwtIGMoTE9PQ1ZfbTZfc2Vuc2liaWxpZGFkLCBMT09DVl9tN19zZW5zaWJpbGlkYWQsIExPT0NWX204X3NlbnNpYmlsaWRhZCwgTE9PQ1ZfbTlyZl9zZW5zaWJpbGlkYWQsTE9PQ1ZfbTExX3NlbnNpYmlsaWRhZCkKRXNwZWNpZmljaWRhZCA8LSBjKExPT0NWX202X2VzcGVjaWZpY2lkYWQsIExPT0NWX203X2VzcGVjaWZpY2lkYWQsIExPT0NWX204X2VzcGVjaWZpY2lkYWQsIExPT0NWX205cmZfZXNwZWNpZmljaWRhZCwgTE9PQ1ZfbTExX2VzcGVjaWZpY2lkYWQpCkFVQ1JPQyA8LSBjKExPT0NWX202X0FVQ1JPQywgTE9PQ1ZfbTdfQVVDUk9DLCBMT09DVl9tOF9BVUNST0MsIExPT0NWX205cmZfQVVDUk9DLExPT0NWX20xMV9BVUNST0MgKQpBY2N1cmFjeSA8LSBjKExPT0NWX202X2FjY3VyYWN5LCBMT09DVl9tN19hY2N1cmFjeSwgTE9PQ1ZfbThfYWNjdXJhY3ksIExPT0NWX205cmZfYWNjdXJhY3ksIExPT0NWX20xMV9hY2N1cmFjeSkKUHJlY2lzaW9uIDwtIGMoTE9PQ1ZfbTZfcHJlY2lzaW9uLCBMT09DVl9tN19wcmVjaXNpb24sIExPT0NWX204X3ByZWNpc2lvbiwgTE9PQ1ZfbTlyZl9wcmVjaXNpb24sTE9PQ1ZfbTExX3ByZWNpc2lvbikKVlBOIDwtIGMoTE9PQ1ZfbTZfVlBOLCBMT09DVl9tN19WUE4sIExPT0NWX204X1ZQTiwgTE9PQ1ZfbTlyZl9WUE4sTE9PQ1ZfbTExX1ZQTikKVEZQIDwtIGMoTE9PQ1ZfbTZfVEZQLCBMT09DVl9tN19URlAsIExPT0NWX204X1RGUCwgTE9PQ1ZfbTlyZl9URlAsTE9PQ1ZfbTExX1RGUCkKCgpwZXJmb3JtYW5jZV9tb2RlbG9zX0xPT0NWIDwtIGRhdGEuZnJhbWUobW9kZWxvcywgU2Vuc2liaWxpZGFkLCBFc3BlY2lmaWNpZGFkLCBBVUNST0MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2N1cmFjeSwgUHJlY2lzaW9uLCAgVlBOLCBURlApCgpwbG90X3BlcmZfbW9kZWxfTE9PQ1YgPC0gcGVyZm9ybWFuY2VfbW9kZWxvc19MT09DViAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC1tb2RlbG9zLAogICAgICAgICAgICAgICBuYW1lc190byA9ICJNZXRyaWNhcyIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJWYWxvciIKICApCgojIGNyZWFtb3MgZWwgcGxvdAoKZ2dwbG90KCkrCiAgZ2VvbV9wb2ludChkYXRhPXBsb3RfcGVyZl9tb2RlbF9MT09DViwgYWVzKHg9TWV0cmljYXMsIHk9VmFsb3IsIGNvbG9yPW1vZGVsb3MpLCBzaXplPTMpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCgojIGxhIGNvbXBhcmFjaW9uIGZpbmFsIGxhIHBvZGVtb3MgaGFjZXIgY29uIGxhcyBBVUNST0MgeSBzdXMgSUMKCklDX2xvd2VyXzk1IDwtIGMocm9jX0xPT0NWX202JGNpWzFdLCByb2NfTE9PQ1ZfbTckY2lbMV0sIHJvY19MT09DVl9tOCRjaVsxXSwgcm9jX0xPT0NWX205cmYkY2lbMV0scm9jX0xPT0NWX20xMSRjaVsxXSApCklDX3VwcGVyXzk1IDwtIGMocm9jX0xPT0NWX202JGNpWzNdLCByb2NfTE9PQ1ZfbTckY2lbM10sIHJvY19MT09DVl9tOCRjaVszXSwgcm9jX0xPT0NWX205cmYkY2lbM10scm9jX0xPT0NWX20xMSRjaVszXSkKCmRiX0FVQ1JPQ19tb2RlbG9zIDwtIGFzLmRhdGEuZnJhbWUoY2JpbmQobW9kZWxvcywgQVVDUk9DLCBJQ19sb3dlcl85NSwgSUNfdXBwZXJfOTUpKQpkYl9BVUNST0NfbW9kZWxvcwojIE5PIGhheSBkaWZlcmVuY2lhIHNpZ25pZmljYXRpdmEsIHRvZG9zIGxvcyBJQyA5NSUgc2Ugc3VwZXJwb25lbgoKI1NlbGVjY2lvbiBkZSBtb2RlbG8gcG9yIEFJQyAKCm1tNiA8LSBleHRyYWN0QUlDKExPT0NWX202JGZpbmFsTW9kZWwpIzM3OQptbTcgPC0gZXh0cmFjdEFJQyhMT09DVl9tNyRmaW5hbE1vZGVsKSAjMzY3Cm1tOCA8LSBleHRyYWN0QUlDKExPT0NWX204JGZpbmFsTW9kZWwpIzM3OQptbTkgPC0gZXh0cmFjdEFJQyhMT09DVl9tOXJmJGZpbmFsTW9kZWwpIzM4MQptbTExIDwtIGV4dHJhY3RBSUMoTE9PQ1ZfbTExJGZpbmFsTW9kZWwpICMzNjUKQUlDX2ZpbmFsZXMgPC0gYyhtbTYsIG1tNywgbW04LCBtbTgsIG1tMTEpCkFJQ19maW5hbGVzCiNDT05DTFVTSU9OOiBlbCBtb2RlbG8gbTExIGVzIGVsIHF1ZSB0aWVuZSBtZWpvciBBVUMsIFMgeSBFIHkgQUlDIHkgZXMgZWwgbW9kZWxvIGVsZWdpZG8uIApgYGAKPiBDT05DTFVTSU9OOiBlbCBtb2RlbG8gbTExIGVzIGVsIHF1ZSB0aWVuZSBtZWpvciBBVUMsIFMgeSBFIHkgQUlDIHkgZXMgZWwgbW9kZWxvIGVsZWdpZG8uIAoKIyMgMTApICoqUHJlc2VudGFjacOzbiBkZSBsb3MgZGF0b3MgZmluYWxlcyoqCgo+Lk5vIGVzIHBvc2libGUgZ3JhZmljYXIgZW4gdMOpcm1pbm9zIGRlIE9kZHMgUmF0aW8gbG9zIG1vZGVsb3MgY29uIGZ1bmNpw7NuIHNtb290aCB1dGlsaXphZG9zIGNvbiBsaWJyZXJpYSBjYXJldC4KUG9yIGxvIHRhbnRvIGluY2x1aW1vcyBsYXMgdGFibGFzIHJlc3VtZW4geSBncmFmaWNvcyBxdWUgdmFsaWRhbiBudWVzdHJvIG1vZGVsbyBwcm9wdWVzdG8uCj4uQ29tbyBjb25jbHVzw63Ds24sIGVuIGVzdGUgcmVnaXN0cm8gZGUgcGFjaWVudGVzIGNvbiB0cm9tYm9lbWJvbGlzbW8gZGUgcHVsbcOzbiwgbHVlZ28gZGUgcmVhbGl6YXIgdW4gbW9kZWxvIGFkaXRpdm8gZ2VuZXJhbGl6YWRvLCBzZSBldmlkZW5jaWEgcXVlIGxhcyB2YXJpYWJsZXMgSGVtb2dsb2JpbmEsIHByZXNlbmNpYSBkZSBiaW9tYXJjYWRvcmVzIHBvc2l0aXZvcywgbGEgcHJlc2VuY2lhIGRlIGRpc2Z1bmNpw7NuIHZlbnRyaWN1bGFyIGRlcmVjaGEgZW4gZWwgZWNvY2FyZGlvZ3JhbWEsIGxhIGVkYWQgPiA3NSBhw7FvcyB5IGVsIGFudGVjZWRlbnRlIGRlIEFDViBwcmV2aW8gc2UgYXNvY2lhbiBkZSBmb3JtYSBzaWduaWZpY2F0aXZhIGEgbGEgcHJlc2VuY2lhIGRlIHNhbmdyYWRvIGNvbW8gY29tcGxpY2FjacOzbiBlbiBsYSBldm9sdWNpw7NuIGludHJhaG9zcGl0YWxhcmlhIHkvbyBhIDMwIGTDrWFzIGRlIHNlZ3VpbWllbnRvIGFtYnVsYXRvcmlvLgoKYGBge3J9CiNObyBlcyBwb3NpYmxlIGdyYWZpY2FyIGVuIHTDqXJtaW5vcyBkZSBPZGRzIFJhdGlvIGxvcyBtb2RlbG9zIGNvbiBmdW5jacOzbiBzbW9vdGggdXRpbGl6YWRvcyBjb24gbGlicmVyaWEgY2FyZXQuCiNQb3IgbG8gdGFudG8gaW5jbHVpbW9zIGxhcyB0YWJsYXMgcmVzdW1lbiB5IGdyYWZpY29zIHF1ZSB2YWxpZGFuIG51ZXN0cm8gbW9kZWxvIHByb3B1ZXN0bwoKI2Ryb3AgdGVzdCBwYXJhIHZlciBzaWduaWZpY2FuY2lhIGRlIGNhZGEgdmFyaWFibGUgZW4gbW9kZWxvIGVsZWdpZG8KZHJvcAojZ3JhZmljbyBjb24gdmFyaWFibGUgSGIgc3Vhdml6YWRhIHBhcmEgZWwgbW9kZWxvIGVsZWdpZG8KcGxvdChMT09DVl9tMTEkZmluYWxNb2RlbCkKI2dyw6FmaWNvIGRlIHJlc2lkdW9zIHRpcG8gd29ybXMgcGFyYSBtb2RlbG8gR0FNIGVsZWdpZG8KbGlicmFyeShnYW1sc3MpCndwKG1vZGVsb19nbG0yXzMsIHlsaW0uYWxsID0gMSkKI2N1cnZhIFJPQyBkZWwgbW9kZWxvIGVsZWdpZG8KbGlicmFyeShwUk9DKQpwUk9DX29iaiA8LSBwUk9DOjpyb2MoYmFzZV9nYW0kQ29tcGxfU2FuZ19Ub2RvcyxMT09DVl9tMTEkcHJlZFssNF0sCiAgICAgICAgICAgIHNtb290aGVkID0gVFJVRSwKICAgICAgICAgICAgIyBhcmd1bWVudHMgZm9yIGNpCiAgICAgICAgICAgIGNpPVRSVUUsIGNpLmFscGhhPTAuOSwgc3RyYXRpZmllZD1GQUxTRSwKICAgICAgICAgICAgIyBhcmd1bWVudHMgZm9yIHBsb3QKICAgICAgICAgICAgcGxvdD1UUlVFLCBhdWMucG9seWdvbj1UUlVFLCBtYXguYXVjLnBvbHlnb249VFJVRSwgZ3JpZD1UUlVFLAogICAgICAgICAgICBwcmludC5hdWM9VFJVRSwgc2hvdy50aHJlcz1UUlVFKQoKCnNlbnMuY2kgPC0gY2kuc2UocFJPQ19vYmopCnBsb3Qoc2Vucy5jaSwgdHlwZT0ic2hhcGUiLCBjb2w9ImxpZ2h0Ymx1ZSIpCnBsb3Qoc2Vucy5jaSwgdHlwZT0iYmFycyIpCmBgYAo=